Введение
Одна из наиболее распространенных проблем, с которыми сталкиваются пользователи, впервые работающие с 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.