Поиск файлов в Linux. Утилита find

Введение

Одна из наиболее распространенных проблем, с которыми сталкиваются пользователи, впервые работающие с Linux — поиск нужных файлов. В данном руководстве рассмотрено использование команды find, которая позволяет решить эту проблему и осуществлять поиск файлов с различными фильтрами и параметрами.

Поиск по имени

Это наиболее очевидный способ поиска файлов. Для поиска по имени введите:

find -name "имя"

Этот запрос будет чувствительным к регистру, то есть “file” и “File” будут восприниматься как разные имена.

Для поиска по имени без учёта регистра введите:

find -iname "имя"

Если вам требуется найти все файлы, не соответствующие определенному шаблону, можно инвертировать поиск при помощи параметра “-not” или “!”. При использовании “!” нужно экранировать символ, чтобы bash не попытался интерпретировать его до начала работы find:

find -not -name "исключаемое_имя"

или

find \! -name "исключаемое_имя"

Поиск по типу

Вы можете указать тип файлов, которые вам нужно найти, при помощи параметра «-type» Это работает следующим образом:

find -type дескриптор_типа запрос

Вот наиболее распространенные дескрипторы типа:

f: обычный файл
d: директория
l: символическая ссылка
c: символьные устройства
b: блочные устройства

Например, если нам нужно найти все символьные устройства в системе, можно выполнить следующую команду:


А так мы можем выполнить поиск всех файлов, которые заканчиваются на «.conf»:

find / -type f -name "*.conf"

Поиск по времени и размеру

Find предоставляет ряд способов фильтрации результатов по размеру и времени.

Поиск по размеру

Фильтрация по размеру осуществляется при помощи параметра «-size».

После значения размера нужно указать суффикс, обозначающий единицы измерения. Вот несколько наиболее распространенных вариантов:

c: байты
k: килобайты
M: мегабайты
G: гигабайты
b: блоки по 512 байт

Чтобы найти все файлы с размером ровно 100 байт, введите:

find / -size 100c

Для поиска всех файлов меньше 100 байт мы можем воспользоваться следующей формой:

find / -size -100c

Для поиска файлов больше 500 мегабайт можно использовать следующую команду:

find / -size +500M

Поиск по время

Linux хранит данные о времени доступа, времени модификации и времени изменения.

  • Время доступа: время последнего чтения файла или записи в него.
  • Время модификации: время последнего изменения содержимого файла.
  • Время изменения: время последнего изменения метаданных в индексном узле (inode) файла.

Для фильтрации по этим значениям мы можем использовать параметры «-atime», «-mtime» и «-ctime», соответственно, а также символы плюса и минуса для поиска файлов с более ранним или поздним временем, аналогично фильтрации по размеру.

Значение этих параметров указывает, на сколько дней назад нужно осуществлять поиск.

Для поиска файлов, содержимое которых было изменено вчера, введите:

find / -mtime 1

Если нам нужны файлы, к которым осуществлялся доступ вчера и позже, можно воспользоваться командой:

find / -atime -1

Чтобы получить файлы, метаданные которых были изменены более трёх дней назад, воспользуйтесь следующей командой:

find / -ctime +3

Также существуют дополнительные параметры, которые позволяют указывать минуты вместо дней. Эта команда выдает файлы, измененные за последнюю минуту:

find / -mmin -1

Кроме того, find может выполнять сравнение с заданным файлом и выводить все файлы новее:

find / -newer myfile

Поиск по владельцу и разрешениям

Используя параметры «-user» и «-group», можно осуществлять поиск файлов по владельцу или группе, соответственно. Чтобы найти файл пользователя «syslog», нужно ввести:

find / -user syslog

Аналогично можно задать поиск файлов группы «shadow»:

find / -group shadow

Также можно искать файлы с определенными разрешениями.

Если нам нужно соответствие точному набору разрешений, используется следующая форма:

find / -perm 644

При необходимости найти все файлы с разрешениями не ниже указанных нужно ввести:

find / -perm -644

Этому критерию будут соответствовать все файлы с дополнительными разрешениями. Например, в данном случае ему будет соответствовать файл с разрешениями «744».

Фильтрация по глубине

Для этого раздела нам потребуется создать во временной директории трехуровневую структуру директорий с десятью директориями на первом уровне. В каждой директории (включая временную) будет десять поддиректорий и десять файлов.

Создадим структуру выполнением следующих команд:

mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test

Для проверки структуры можно воспользоваться командами ls и cd. Разобравшись в организации нужно вернуться в тестовую директорию:

cd ~/test

Теперь попробуем найти в этой структуре конкретные файлы. Начнем с примера обычного поиска по имени:

find -name file1

Результатов очень много. Если мы переведем вывод на счётчик, мы увидим, что всего таких файлов 1111:

find -name file1 | wc -l
1111

В большинстве случаев эти результаты избыточны. Давайте попробуем сузить поиск.

Можно задать максимальную глубину поиска в директории поиска верхнего уровня:

find -maxdepth число -name имя

Чтобы найти «file1» только в директориях «level1» и выше, нужно указать максимальную глубину, равную 2 (1 для директории верхнего уровня и 1 для директорий уровня 1):

find -maxdepth 2 -name file1


С этим списком справиться гораздо проще.

Если вы знаете, что все файлы находятся далее определенной точки в текущей директории, можно также указать минимальную глубину:

find -mindepth число -name имя

Так мы можем найти все файлы на концах ветвей дерева директорий:

find -mindepth 4 -name file1


. . .
Из-за нашей древовидной структуры снова будет выведено большое количество результатов (1000).

Можно комбинировать максимальную и минимальную глубину, чтобы сосредоточиться на узком диапазоне:

 

Выполнение команд над результатами

Над любыми файлами, которые вы найдете командой find, можно выполнить произвольную дополнительную команду при помощи параметра «-exec». Это выполняется следующим образом:

find параметры_find -exec команда_и_параметры {} \;

Фигурные скобки «{}» используются в качестве заполнителя места для файлов, найденных командой find. Обратный слэш и точка с запятой «\;» используются для того, чтобы указать find, где кончается команда.

Например, мы можем найти файлы из предыдущего раздела с разрешениями “644” и изменить разрешения на “664”:

cd ~/test
find . -type f -perm 644 -exec chmod 664 {} \;

Затем мы можем изменить разрешения для директории следующим образом:

find . -type d -perm 755 -exec chmod 700 {} \;

Если вам нужно объединить различные результаты, вы можете воспользоваться командами «-and» или «-or». «-and» предполагается по умолчанию и опускается.

find . -name file1 -or -name file9

Заключение

Find — полезная команда, возможности которой можно расширить, объединяя ее с другими утилитами. Можно поэкспериментировать с фильтрацией при помощи команд wc, sort и grep.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

ИТ Проффи

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: