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