find 002

find — консольная утилита для поиска файлов по имени и другим свойствам, может производить поиск в одном или нескольких каталогах с использованием критериев (заданных пользователем, также поддерживаются регулярные выражения) и позволяет применять пользователю определённые действия ко всем найденным файлам. Одна из утилит пакета Findutils (утилиты для поиска файлов).

find 003

find имеет множество опций (ключей), оторые можно посмотреть вызвав справку приложения (-n / --help). Наиболее полезной (для меня) и довольно регулярно используемой оказалась возможность поиска файлов, которые были модифицированы/созданы недавно и/или за какой-либо заданный промежуток времени. Например, при изменении настройки системы, можно забыть где именно и какие были сохранены/изменены. Или если возникнет необходимость проверить появились/изменялись ли и когда именно файлы.

find 004

Чтобы вывести список файлов во всей файловой системе, изменённых в течение последней минуты используется команда:
find / -mmin -1 -print

Вывести список файлов во всей файловой системе, которые были изменены более 30 дней назад:
find / -mtime +30 -print

Чтобы найти недавно модифицированные файлы в каталоге /etc и его подкаталогах, отсортированные в обратном порядке (файл измененный последним, будет показан первым), используется команда вида:
find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Вывод по окончании выполнения команды покажет отсортированный список вместе с их расположением в файловой системе и временем последнего изменения. Если же планируется проверить новые каталоги, надо использовать команду без опции -type f:
find /etc -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Поиск файлов, которые были модифицированы в последний час в домашнем каталоге и во всех его подкаталогах нужно выполнить (к примеру если надо узнать то скачано веб-браузером):
find ~/ -type f -mmin -60

Поиск файлов, которые были модифицированы в последние 3 дня в домашнем каталоге и во всех его подкаталогах нужно выполнить:
find ~/ -type f -mtime -3

Поиск файлов, которые были модифицированы в последние 3 дня в домашнем каталоге и во всех его подкаталогах, глубиной до 3 уровня нужно выполнить:
find ~/ -type f -mtime -3 -depth -3

Также можно задать диапазон времени модификации. Поиск файлов в домашнем каталоге и во всех его подкаталогах, которые были модифицированы в последние 7 дней, но не позднее чем 3 дня назад:
find ~/ -type f -mtime -7 ! -mtime -3

Все эти команды выводят только путь к найденным файлам, можно также детализировать вывод информации с помощью опции -exec. Поиск файлов в домашнем каталоге и во всех его подкаталогах, которые были модифицированы в последние 60 минут и полный вывод атрибутов файлов:
find ~/ -type f -mmin -60 -exec ls -al {} \;

В качестве альтернативы вы можете использовать для этого команду xargs:
find ~/ -type f -mmin -60 | xargs ls -l

Эти команды найдут также файлы, созданные в заданный промежуток времени. Если необходимо найти все битые ссылки (т.е. ссылки которые указывают на файлы, которых уже не существует), поможет комманда:
find ~/ -type l | while read link; do [ -e `readlink $link` ] || echo $link; done

Можно удалить их:
find ~/ -type l | while read link; do [ -e `readlink $link` ] || echo $link; done|xargs rm -f 

Или:
find ~/ -type l | while read link; do [ -e `readlink $link` ] || rm -f $link; done

Можно перенести их куда-нибудь (например в каталог ~/мусор):
find ~/ -type l | while read link; do [ -e `readlink $link` ] || mv $link ~/мусор; done

Поиск файлов в домашнем каталоге содержащих нужный текст в названии, изменённых за последние 30 дней:
find ~/ -name *текст* -mtime +30 -print

Что бы найти файлы в домашнем каталоге с одинаковыми именами и количество повторений нужно выполнить:
find ~/ -type f -printf '%f\n' | sort | uniq -dc


find 005

В заключении краткий список основных опций (ключей):

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


find 006

Дополнительные материалы:

Поиск в unix. Часть1
Поиск в unix. Часть2
Поиск файлов с помощью find
Расширенные возможности использования команды find в UNIX

find 007