Содержание

, , ,

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 / типы

Параметры

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

  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