find - Поиск файлов с реальном сканированием.

Команда find выполняет просмотр файловой системы для поиска файла, что делает этот инструмент медленным, но эффективным. Для поиска по имени обязательно нужно указывать ключ -name Пример:

find -name filename.txt

По умолчанию find производит поиск рекурсивно в текущем каталоге.

Описание опций
Опция	Описание
-name	Поиск по имени.
-iname	Регистронезависимый поиск по имени.
-type	Тип объекта поиска. Возможные варианты: f — файл; d — каталог; l — ссылка; p — pipe; s — сокет.
-size	Размер объекта. Задается в блоках по 512 байт или просто в байтах (с символом «c»).
-mtime	Время изменения файла. Указывается в днях.
-mmin	Время изменения в минутах.
-atime	Время последнего обращения к объекту в днях.
-amin	Время последнего обращения в минутах.
-ctime	Последнее изменение владельца или прав на объект в днях.
-cmin	Последнее изменение владельца или прав в минутах.
-user	Поиск по владельцу.
-group	По группе.
-perm	С определенными правами доступа.
-depth	Поиск должен начаться не с корня, а с самого глубоко вложенного каталога.
-maxdepth	Максимальная глубина поиска по каталогам. -maxdepth 0 — поиск только в текущем каталоге. По умолчанию, поиск рекурсивный.
-prune	Исключение перечисленных каталогов.
-mount	Не переходить в другие файловые системы.
-regex	По имени с регулярным выражением.
-regextype <тип>	Тип регулярного выражения.
-L или -follow	Показывает содержимое символьных ссылок (симлинк).
-empty	Искать пустые каталоги.
-delete	Удалить найденное.
-ls	Вывод как ls -dgils
-print	Показать найденное.
-print0	Путь к найденным объектам.
-exec <команда> {} \;	Выполнить команду над найденным.
-ok	Выдать запрос перед выполнением -exec.
Также доступны логические операторы:
Оператор	Описание
-a	Логическое И. Объединяем несколько критериев поиска.
-o	Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска.
-not или !	Логическое НЕ. Инвертирует критерий поиска.

type / типы

-type f

-type d

Параметры

В параметре поставляет найденные значения -exec

{}

Пример:

find ./ -name "*.php" -exec rm {} \;

Смена кодировки у множества файлов

for i in *; do iconv -f windows-1251 -t utf-8 "$i" >tmp; mv tmp "$i"; done find . \( -name '*.php' -o -name '*.inc' \) -print or find . -name '*.php' -o -name '*.inc' find . -name "*.php" | while read i; do iconv -f windows-1251 -t utf-8 "$i" >tmp; mv tmp "$i"; done find . -name "*.php" -o -name "*.inc" -o -name "*.module" | while read i; do iconv -f windows-1251 -t utf-8 "$i" >tmp; mv tmp "$i"; done

Смена прав у файлов и каталогов

Смена прав у каталогов

find . -type d -exec chmod 755 {} \;

Эта команда рекурсивно пройдется по текущему (точка ".") каталогу и всем его подкаталогам и изменит права на 755 только у каталогов (-type d)

find . -type f -exec chmod 644 {} \;

всем файлам - 644

Смена прав у файлов

find . -type f -name '*.htm*' -exec chmod 644 {} \;

Определенным файлам

Рекурсивное удаление по маске

Пример рекурсивного удаления всех git репозиториев

find . -type d -name '.git' -exec rm -R -f {} \;

Поиск необходимого контента в файлах

find ./ -type f -print -name *.php -exec grep 'eval' --color=auto {} \;

Поиск бэкдоров или вирусов на сайте

Вычислить размер папки, без подпапок

find . -maxdepth 0 -type d -mindepth 0 -exec du -hs {} \;

Удалить большое количество файлов

Иногда при удление файлов командой rm, возникает сообщение об ошибке "/bin/rm: Argument list too long." Ниже след команда позволит ее избежать

find . -type f -name "thumb_*" -print | xargs rm find ./ -type f -name "thumb_*" -exec rm -f {} \; find . -maxdepth 1 -name 'thumb_*' -exec rm -f {} \; find . -maxdepth 1 -name '*.js' -exec rm -f {} \; find . -type f -name '*.gz' -exec rm -R -f {} \;

Удалить файлы созданные позднее 3 дней

find /tmp -mtime +3 -name 'tmp-*' -exec rm -Rf -- {} \;

Поиск каталога

find / -type d -name "basic"

Замена таба на 4 пробела

find . -type f -exec sed -i.orig 's/\t/ /g' {} +

Отображение всех путей вложенных папок

$ export FINDPATH="/var/lib" $ DEPTH=$(( $(find $FINDPATH -type d | sed 's|[^/]||g' | sort | tail -n1 | egrep -i -o / | wc -l) - $(echo $FINDPATH | sed 's|[^/]||g' | sort | tail -n1 | egrep -i -o / | wc -l) )) $ find $FINDPATH -mindepth $DEPTH -maxdepth $DEPTH -type d