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 |
Показать найденное. | |
-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