Find - утилита поиска файлов по имени и другим свойствам.

Список ключей

-name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки. Опция `-name' различает прописные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией `-iname'.
-type — тип искомого: f=файл, d=каталог, l=ссылка (link), p=канал (pipe), s=сокет.
-user — владелец: имя пользователя или UID.
-group — владелец: группа пользователя или GID.
-perm — указываются права доступа.
-size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
-atime — время последнего обращения к файлу (в днях).
-amin — время последнего обращения к файлу (в минутах).
-ctime — время последнего изменения владельца или прав доступа к файлу (в днях).
-cmin — время последнего изменения владельца или прав доступа к файлу (в минутах).
-mtime — время последнего изменения файла (в днях).
-mmin — время последнего изменения файла (в минутах).
-newer другой_файл — искать файлы созданные позже, чем другой_файл.
-delete — удалять найденные файлы.
-ls — генерирует вывод как команда ls -dgils.
-print — показывает на экране найденные файлы.
-print0 — выводит путь к текущему файлу на стандартный вывод, за которым следует символ ASCII NULL (код символа 0).
-exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
-ok — перед выполнением команды указанной в -exec, выдаёт запрос.
-depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
-maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 0» ограничивает поиск текущим каталогом.
-prune — используется, когда вы хотите исключить из поиска определённые каталоги.
-mount или -xdev — не переходить на другие файловые системы.
-regex — искать по имени файла используя регулярные выражения.
-regextype тип — указание типа используемых регулярных выражений.
-P — не разворачивать символические ссылки (поведение по умолчанию).
-L — разворачивать символические ссылки.
-empty — только пустые каталоги.

 

-Найти все файлы в системе с именем top:

# find / -name top

-Чтобы найти top без учета регистра символов:

# find / -iname top

-Чтобы получить список файлов системы, имена которых начинаются с букв `top':

# find / -name 'top*' 

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

# find / -name 'top???' 

-Чтобы получить список файлов системы, имена которых начинаются с букв `top', за которыми следуют пять и более символов:

# find / -name 'top?????*' 

-Чтобы увидеть все файлы с расширением `.tex'в Вашем рабочем каталоге, независимо от их написания:

# find ~ -iname '*.tex' 

-Чтобы увидеть все файлы в каталоге `/usr/share', содержащие в имени слово `farm':

# find /usr/share -name '*farm*'

-Чтобы увидеть все файлы в текущем каталоге, имена которых содержат строку `net' или `comm':

# find . -regex '.*\(net\|comm\).*'  

-Поиск в каталогах /usr/local/man и /opt/local/man файлов, название которых начинается на my:

# find /usr/local/man /opt/local/man -name 'my*'

-Глубина поиска указывается относительно каталога, указанного в аргументе команды

# find . -maxdepth 4 -name 'restore.php'

-Ищет файлы в указанных каталогах.

# find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f

-Найти все файлы, начиная с текущего каталога, название которых начинается на my или qu. Обратите внимание, что по умолчанию все аргументы соединены с помощью логического и (опция '-a'). Если необходимо объединить несколько аргументов логическим или — используйте опцию '-o':

# find . \( -name "my*" -o -name "qu*" \) -print

-Если при поиске возникает ошибка (например — нет доступа чтения из каталога) то вывод команды становится менее информативным:

# find / -name 'secret.keys' -print 2>/dev/null

 

 

-Чтобы вывести список файлов в каталоге `/usr/local', размер которых больше 10,000 килобайт:

# find /usr/local -size +10000k

-Чтобы вывести список файлов в домашнем каталоге, размер которых меньше 300 байт:

# find ~ -size -300b

-Чтобы вывести список файлов системы, размер которых составляет 42 блока по 512 байт:

# find / -size 42

-Чтобы найти все пустые файлы в Вашем домашнем каталоге:

# find ~ -empty

 

 

-Чтобы вывести все файлы в каталоге `/usr/local', модифицированные точно 24 часа назад:

# find /usr/local -mtime 1

-Чтобы вывести все файлы в каталоге `/usr', модифицированные 5 минут назад:

# find /usr -mmin 5

Если Вы хотите указать промежуток времени, поставьте перед числом либо знак плюс (`+'), определяя большее или равное аргументу время, или знак минус (`-'), определяя время, меньшее или равное аргументу.

-Чтобы вывести все файлы в каталоге `/usr/local', модифицированные в течение последних 24 часов:

# find /usr/local -mtime -1

-Опция `-daystart' определяет отсчет времени с момента начала текущих суток. Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные вчера:

# find ~ -mtime 1 -daystart

-Чтобы вывести все файлы в каталоге `/usr', модифицированные в течение года:

# find /usr -mtime +356 -daystart

-Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные в период от 2 до 4 дней тому назад:

# find ~ -mtime 2 -mtime -4 -daystart

-Чтобы вывести все файлы в каталоге `/etc', которые новее файла `/etc/motd':

# find /etc -newer /etc/motd

Чтобы найти все файлы новее определенной даты, используйте следующий трюк: создайте временный файл в каталоге `/tmp' и установите дату его модификации на требуемую с помощью touch, а затем поределите его как аргумент для `-newer'.

-Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные после 4 мая текущего года:

# touch -t 05040000 /tmp/timestamp
# find ~ -newer /tmp/timestamp

 

 

-Для поиска всех файлов в каталоге `/usr/local/fonts', принадлежащих пользователю warwick:

# find /usr/local/fonts -user warwick

-Чтобы вывести список файлов в каталоге `/dev', принадлежащих группе audio:

# find /dev -group audio

 

 

Выполнение команды

Вы можете использовать команду find для выполнения других команд над найденными файлами, указав требуемые команды в качестве аргументов опции `-exec'.

-Найти все графические файлы, начиная с текущем каталоге, используя регулярные выражения.

# find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"

-Найти все каталоги ниже указанного каталога и изменить им права доступа:

# find /path -type d -exec chmod 0755 "{}" \;

-Опция -exec работает примерно в 10 раз медленнее, чем перенаправление вывода через xargs, поэтому данный код рекомендуется писать следующим образом. (опция -- -0 позволяет обрабатывать аргументы, содержащие пробелы и кавычки, т.к. использует NULL ("\0") вместо символов-разделителей "пробел" и "перевод строки"):

# find /path -type d -print0 | xargs -0 chmod 0755

-Поиск всех файлов php.ini от текущего каталога и замена текста в каждом найденном файле.

# find . -name 'php.ini' -exec sed -i 's/log_errors = Off/log_errors = On/g' "{}" \;

-Сложный поиск в нескольких видах файлов и замен текста в каждом из них, от текущего каталога и ниже.

# find . -regex ".*\.\(php\|js\|css\)" -exec sed -i 's/\/bitrix\/templates\//\/local\/templates\//g' "{}" \;

-Удаляет все файлы restore.php от текущего каталога, но не глубже 4 уровня вложенности относительно аргумента в командной строке. Начинает поиск в папке /var/www, но не глубже /var/www/*/*/*/* и удаляет все файлы restore.php в найденном.

# find /var/www -maxdepth 4 -name 'restore.php' -exec rm -r {} \;

-Чтобы найти все файлы в каталоге ` /html/' с расширением `.html', и вывести строки из этих файлов, содержащие слово `organic':

# find ~/html/ -name '*.html' -exec grep organic '{}' ';' 

Чтобы ввести подтверждение выполнения команды для файла, найденного find, используйте ключ `-ok' вместо `-exec'.

-Чтобы удалить из Вашего домашнего каталога файлы, доступ к которым осуществлялся более года назад, с подтверждением для каждого файла:

# find ~ -used +365 -ok rm '{}' ';' 

 

-Удалить файлы старше 5 дней:

find ./ -type f -mtime +5 -exec rm -f {} \;

 

 

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

-Чтобы вывести список файлов в Вашем домашнем каталоге, имена которых начинаются со строки `top', и которые новее файла `/etc/motd':

# find ~ -name 'top*' -newer /etc/motd

-Чтобы сжать все файлы в Вашем домашнем каталоге, размер которых превышает 2 Mb, и которые еще не сжаты с помощью gzip (не имеют расширения `.gz'):

# find ~ -size +2000000c -regex '.*[^gz]' -exec gzip '{}' ';' 

Чтобы посчитать количество файлов во всем дереве каталогов, а не только в отдельном каталоге, используйте find вместо ls, и укажите специальный ключ для find - строку ` ! -type d', чтобы исключить вывод и подсчет каталогов.

-Чтобы вывести количество файлов в дереве `/usr/share', введите:

# find /usr/share \! -type d | wc -l

-Найти и удалить файлы старше 30 дней:

# find /home/user/logs -type f -mtime +30 -exec rm -f {} \;

-Найти и удалить директории старше 30 дней:

# find /home/user/logs -type d -mtime +30 -exec rm -f {} \;

 

 

Материалы:

https://www.opennet.ru/docs/RUS/linux_base/node149.html

https://ru.wikipedia.org/wiki/Find