Linux. Команда find
Это одна из наиболее часто используемых команд Linux. Предназначена для поиска файлов и каталогов на основе условий. Ее можно использовать, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим критериям.
find [каталог] [опции] [действие]
каталог— каталог, в котором будем искать файлыопции— критерии поиска и дополнительные опциидействие— действия с найденными файлами с помощью опции-exec.
Основные опции
-name— искать по имени файла, при использовании подстановочных образцов шаблон заключается в кавычки. Опция различает прописные и строчные буквы; чтобы использовать поиск без этих различий, надо использовать опцию-iname.-type— тип искомого:f=файл,d=каталог,l=ссылка,p=канал,s=сокет.-user— владелец: имя пользователя илиUID.-group— владелец: группа пользователя илиGID.-perm— указываются права доступа.-size— размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).-atime— время последнего обращения к файлу (в днях).-amin— время последнего обращения к файлу (в минутах).-ctime— время последнего изменения владельца или прав доступа к файлу (в днях).-cmin— время последнего изменения владельца или прав доступа к файлу (в минутах).-mtime— время последнего изменения файла (в днях).-mmin— время последнего изменения файла (в минутах).-newer file— искать файлы созданные позже, чемfile.-delete— удалять найденные файлы.-ls— генерирует вывод, как командаls -dgils.-print— показывает на экране найденные файлы.-exec command {} \;— выполняет над найденным файлом указанную команду.-ok— перед выполнением команды указанной в-exec, выдаёт запрос.-depthили-d— начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.-maxdepth— максимальный уровень вложенности для поиска, для поиска в текущем каталоге — 1.-prune— используется, когда вы хотите исключить из поиска определённые каталоги.-mountили-xdev— не переходить на другие файловые системы.-regex— искать по имени файла, используя регулярные выражения.-regextype тип— указание типа используемых регулярных выражений.-P— не разворачивать символические ссылки (поведение по умолчанию).-L— разворачивать символические ссылки.-empty— только пустые файлы и каталоги.
Допускается использование нескольких критериев поиска:
-newer php.ini -a -size +10M— файл будет найден, если оба критерия верны;-aиспользуется по умолчанию, поэтому его можно опускать;-name "*.html" -o -name "*.php"— файл будет найден, если хотя бы один критерий поиска возвращает истину;-not -newer php.ini— инвертирует критерий поиска.
Примеры
Показать все файлы в текущей директории:
$ find
$ find .
Показать все файлы в указанной директории:
$ find ./test
Искать файлы по имени в текущей папке:
$ find . -name "*.jpg"
Не учитывать регистр при поиске по имени:
$ find . -iname "test*"
Поиск файлов по имени только в текущей папке:
$ find . -maxdepth 1 -name "*.php"
Найти файлы в директории, которые не соответствуют шаблону:
$ find /some/path -not -name "test*"
Найти файлы, начинающиеся на test, но без расширения .php:
$ find /some/path -name "test" -not -name "*.php"
Найти все файлы с раширением .html или .php:
$ find /some/path -name "*.html" -o -name "*.php"
Найти все файлы в двух каталогах с расширением .c:
$ find /some/path/one /some/path/two -type f -name "*.c"
Найти скрытые файлы (начинающиеся на точку) в домашней директории:
$ find ~ -type f -name ".*"
Найти файлы в директории с маской прав 0664:
$ find /some/path -type f -perm 0664
Найти все файлы с установленным флагом suid/guid:
$ find /some/path -type f -perm 2644
$ find /some/path -type f -perm /u=s
Поиск файлов только для чтения:
$ find /etc -type f -perm /u=r
Найти только исполняемые файлы:
$ find /bin -type f -perm /a=x
Найти все файлы, принадлежащие пользователю evgeniy:
$ find /some/path -user evgeniy
Поиск файлов, принадлежащих группе developer:
$ find /var/www -group developer
Найти файлы, модифицированные 30 дней назад:
$ find /some/path -type f -mtime 30
Поиск файлов, открытых 30 дней назад:
$ find /some/path -type f -atime 30
Найти файлы, модифицированные между 30 и 60 дней назад:
$ find /some/path -type f -mtime +30 -mtime -60
Найти файлы, измененные в течении последнего часа:
$ find /some/path -type f -cmin -60
Найти все файлы размером 50 мегабайт:
$ find /some/path -type f -size 50M
Все файлы от пятидесяти до ста мегабайт:
$ find /some/path -type f -size +50M -size -100M
Поиск пустых файлов и директорий:
$ find /tmp -type f -empty
$ find ~ -type d -empty
Действия с найденными файлами
Для выполнения произвольных команд для найденных файлов используется опция -exec. Например, выполнить команду ls для получения подробной информации о каждом файле:
$ find . -exec ls -ld {} \;
$ find . -exec ls -ld {} +
Удалить все текстовые файлы в директории tmp
$ find /tmp -type f -name "*.txt" -exec rm -f {} \;
$ find /tmp -type f -name "*.txt" -exec rm -f {} +
Удалить все log-файлы больше 100 мегабайт
$ find /home/evgeniy/log -type f -name "*.log" -size +100M -exec rm -f {} \;
$ find /home/evgeniy/log -type f -name "*.log" -size +100M -exec rm -f {} +
Удалить все жесткие ссылки в директории /tmp/hardlinks
$ find /tmp/hardlinks -type f -not -links 1 -delete
$ find /tmp/hardlinks -type f -links +1 -delete