Когда нужно найти какой-нибудь файл или папку в системе Linux в голову сразу приходит команда find. Она проста в использовании и имеет множество разных опций, которые позволяют оптимизировать поиск файлов. Далее приведём несколько примеров использования этой команды.
Поиск папок
Чтобы сделать поиск по папкам команде find нужно передать параметр type d. Таким образом мы скажем команде find вести поиск только по директориям:
$ find /path/to/search -type d -name "name-of-dir"
Поиск скрытых файлов
Так как скрытые файлы и директории в Linux начинаются с точки, то мы можем задать шаблон поиска так, чтобы команда рекурсивно выводила нам все скрытые файлы и директории. Для этого достаточно ввести следующую команду:
$ find /path/to/search -name ".*"
Поиск файлов по размерам
Команда find дает возможность вести поиск файлов размером больше, меньше или равным указанному значению. Чтобы найти файл размером больше 10Мб нужно ввести команду:
$ find /path/to/search -size +10M
Для поиска файлов размером меньше указанного значения или равного ему нужно ввести следующие команды:
$ find /path/to/search -size -10M $ find /path/to/search -size 10M
Также есть возможность искать файлы размер которых находится в указанном промежутке.
$ find /path/to/search -size +100M -size -1G
Поиск файлов по списку
Допустим нам нужно найти несколько файлов, указанные в списке, который хранится в виде файла с расширением .txt. Для этого мы можем воспользоваться комбинацией команд find и grep. Чтобы данная команда работала корректно, каждый шаблона поиска в списке должен начинаться с новой строки.
$ find /path/to/search | grep -f filelist.txt
Парметр f переданный команде grep означает файл и даёт нам возможность указать файл с шаблонами для поиска. В результате работы вышеуказанной команды система вернёт нам все файлы, название которых указаны в списке.
Найти файл, которого нет в списке
Так же в системе Linux есть возможность поиска, противоположная указанному выше. То есть мы можем искать файлы, которые не указаны в списке файлов. Для этого команде grep передадим параметр vf, что означает обратное сопоставление и вернет нам файлы, названий которых не найдёт в списке шаблонов.
$ find /path/to/search | grep -vf filelist.txt
Указываем максимальную глубину поиска
По умолчанию, команда find ищет файлы во всех директориях и поддиректориях. Допустим, если мы в качестве пути для поиска укажем корневую директорию "/", то система будет искать искомый файл по всему жесткому диску. Мы можем ограничить область поиска командой maxdepth указав ему насколько глубоко нужно искать файл.
$ find . -maxdepth 0 -name "myfile.txt"
Команды указанная выше говорит системе искать файл только в указанной директории. А следующая команда предписывает вести поиск в указанной директории и в одной поддиректори.
$ find . -maxdepth 1 -name "myfile.txt"
Поиск пустых файлов
Команда find также позволяет вести поиск по пустым файлам и директориям. Для этого команде добавляем флаг empty. Следующие две команды позволяют найти пустые файли и папки. Для поиска папок к строке поиске добавляет ключ d:
$ find /path/to/search -type f empty $ find /path/to/search -type d empty
Так же можно автоматически удалять найденные пустые файлы или папки. Следующая команда найдет и удалит все пустые файлы в указанной папке и всех подпапках:
$ find /path/to/search -type f -empty delete
Поиск самого большого файла или папки
Если нужно быстро определить какой файл или какая папка в системе занимает больше всего места, то команда find с соответствующими ключами позволит нам рекурсивно искать и сортировать файлы/папки по их размеру:
$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -1
Заметьте, что при поиске мы прибегнули к двум другим удобным инструментам Linux: sort и tail. Sort отсортирует файл по их размеру, а tail покажет самый последний файл в списке, который и будет самым большим файлом/папкой. Мы можем изменить команду так, чтобы она выводила пять самых больших файлов для этого нужно воспользоваться следующей командой:
$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -5<
Также можно вывести файлы с самым меньшим размером. Следующая команда позволит вывести пять самых маленьких по объёму файлов:
$ find /path/to/search -type f -printf "%s %p " | sort -n | head -5
Чтобы найти самую большую папку по указанному пути нужно ввести команду указанную ниже:
$ find /path/to/search -type d -printf "%s %p " | sort -n | tail -1
Поиск файлов с атрибутом setuid
Атрибут setuid файла позволяет обычному пользователю запускать файлы от имени root-а. Такие файлы тоже легко найти с помощью команды find и нескольких параметров. Команда имеет два параметра, которые позволяют искать файлы с конкретными правами: -user и perm. Чтобы найти файлы, который можно запускать от имени root-а можем прописать команду:
$ find /path/to/search -user root -perm /4000
На скриншоте мы добавили еще параметр exec чтобы ограничить вывод команды find. Полная команда выглядит так:
$ find /path/to/search -user root -perm /4000 -exec ls -l {} ;
Мы можем заменить root любым другим пользователем или просто опустить этот параметр и найти все файлы с правами запуска от имени root-а:
$ find /path/to/search -perm /4000
Поиск файлов с атрибутом sgid
Команда поиск файлов с атрибутом sgid почти такая же как и для SUID с той разницей, что вместо 4000 прописываем 2000:
$ find /path/to/search -perm /2000
Так же можем найти файлы, которые имеют оба указанных атрибута:
$ find /path/to/search -perm /6000
Исключение из вывода файлов и папок, к которым нет доступа
Чтобы вести поиск пользователь должен иметь доступ на чтение в указанной папке и подпапках. Если нет соответствующих прав, то мы получим ошибки как на скриншоте ниже.
Этот случай особо актуален при поиске в корневой директории. Согласитесь сильно засоряет вывод, но этого можно избежать если перенаправить вывод stderr в stdout и передать grep для обработки. Следующей командой мы выведем все результаты работы команды find кроме строк, содержащих слова "Permission denied"^
$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"
Поиск файлов изменённых за последние X дней
Чтобы найти файлы, которые были изменены за указанный период времени используется параметр mtime. Ниже приведены несколько примеров для поиска файлов, изменённых за последний 30 дней, больше 30 дней и меньше чем за 30 дней:
$ find /path/to/search -type f -mtime 30 $ find /path/to/search -type f -mtime +30< $ find /path/to/search -type f -mtime -30
Чтобы вывести более детальную информацию о найденных файлах можно указать параметр exec:
$ find /path/to/search -type f -mtime -30 -exec ls -l {} ;
Сортировка результатов по времени
При необходимости отсортировать результате по времени можно воспользоваться параметром printf и утилитой sort:
$ find /path/to/search -printf "%T+ %p " | sort
По умолчанию sort упорядочивает файлы от старых к новым. Чтобы указать обратный порядок сортировки достаточно добавить ключ r к команде sort:
$ find /path/to/search -printf "%T+ %p " | sort r
Разница между locate и find
В системе Linux есть и другая команда, позволяющая вести поиск файлов locate. Но так как она не имеет таких параметров поиска, как find, она не очень гибка, но достаточно практична.
$ locate myfile.txt
Утилита locate ведёт поиск по базе, которая содержит все имена файлов, находящихся в системе. Так как команда locate не ищет указанный файл по всей системе, то она намного эффективней утилиты find. Но с другой стороны база данных этой утилиты обновляется раз в день, что не позволяет найти файлы, созданные раньше, чем 24 часов. Базу данных можно вручную обновлять командой updatedb.
Команда locate особенно полезна если нужно вести поиск файла по всему жесткому диску, так как find в этом случае понадобиться больше времени, так как он проходится по всем директориям в реальном времени.
Если же поиск ведётся в папке, где мало файлов, то лучше пользоваться командой find.
Нагрузка CPU командой find
При поиске по большим каталогам команда find может требовать больше ресурсов. Это должно по своей сути позволять более важным системным процессам иметь приоритет, но если необходимо, чтобы команда find употребляла меньше ресурсов машины, можно использовать команду ionice или nice.
Просмотреть состояние процессора можно командой:
$ top
Чтобы понизить приоритет Ввода/Вывода для команды find, можно ввести следующую команду:
$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"
А чтобы понизить приоритет использования CPU, нужно ввести следующую команду:
$ nice -n 19 find /path/to/search -name "myfile.txt"
Или можно эти две команды комбинировать, чтобы обеспечить низкий приоритет как для Ввода/Вывода, так и для CPU.