{{tag>shell find commands bin}}

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

Команда find выполняет просмотр файловой системы для поиска файла, что делает этот инструмент медленным, но эффективным.
Для поиска по имени обязательно нужно указывать ключ -name
Пример:
<code bash>  find -name filename.txt</code>
По умолчанию 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 <code>{}</code>
  * Пример: <code>find ./ -name "*.php" -exec rm {} \;</code>

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

<code bash>  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
</code>

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

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

<code bash>  find . -type d -exec chmod 755 {} \;</code>

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

<code bash>  find . -type f -exec chmod 644 {} \;</code>

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

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

<code bash>  find . -type f -name '*.htm*' -exec chmod 644 {} \;</code>
Определенным файлам
  
====== Рекурсивное удаление по маске ======

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

<code bash>  find . -type d -name '.git' -exec rm -R -f {} \;</code>
  
====== Поиск необходимого контента в файлах ======

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

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

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

<code bash>  find . -maxdepth 0 -type d -mindepth 0 -exec du -hs {} \;</code>
  
  
====== Удалить большое количество файлов ======

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

<code bash>  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 {} \;</code>
  
====== Удалить файлы созданные позднее 3 дней ======
  
<code bash>  find /tmp -mtime +3 -name 'tmp-*' -exec rm -Rf -- {} \;</code>
  
====== Поиск каталога ======

<code bash>  find / -type d -name "basic"</code>
  
====== Замена таба на 4 пробела ======

<code bash>  find . -type f -exec sed -i.orig 's/\t/    /g' {} +</code>
  
====== Отображение всех путей вложенных папок ======

<code bash>
$ 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
</code>