' Команда find в shell | Шнайдер блог

Команда find в shell

Найти определенный файл или каталог через shell всегда можно при помощи известной команды find. Однако использовать ее можно по-разному, а всяческие опции во время поиска открывают массу дополнительных возможностей. Рассмотрим их подробнее.

Примитивный поиск файла по названию через find выглядит так:

find . -name test

После самой команды find пишется точный путь каталога, в котором нужно что-то найти. В примере указана точка, что говорит о поиске в текущей папке. Параметр -name указывает на поиск по наименованию. В конце обязательно указывается непосредственно имя. Т.е. мы ищем нечто под названием test в текущей папке.

А вот так происходит аналогичный поиск, в котором не учитывается регистр символов:

find . -iname test

Обратите внимание на то, что конструкция поиска позволяет найти как файл, так и папку с заданным именем. Чтобы исключить из выдачи любые папки, нужно конкретизировать тип искомых данных при помощи специального ключа -type.

find . -type f -name test

Применение ключа -type f ограничит выдачу только файлами (f). Аналогично можно сделать и для папок, только использовать нужно уже ключ -type d:

find . -type d -name test

Еще больше сузить область поиска можно, если указать конкретное расширение файлов. К примеру, нам нужно найти все файлы с расширением .db в папке /var/docs:

find /var/docs -type f -name *.db

Как видите, поиск теперь будет не в текущем каталоге, а в заданном нами.

Если же ситуация сложилась так, что имени файла или папки не знаешь, то можно попробовать поискать по времени доступа или по дате создания. Для этого существует ключ -atime:

find . -type f -atime 1

В поисковой выдаче будут все файлы с любым расширением, которые использовались или были созданы за период последних 24 часов. Параметр n в ключе -atime n обозначает количество 24-часовых промежутков.

Можно также отсортировать все, что было задействовано больше суток тому:

find . -type f -atime +1

По той же логике ограничить можно истечением двух суток:

find . -type f -atime +2

А вот так мы найдем все папки, которые были использованы за последние 24 часа:

find . -type f -atime -1

Существуют и другие ключи, используемые по такому же принципу. Самые популярные из них:

«-mtime n» –  ищем файлы, с которыми были проведены любые действия определенное время назад. Само время устанавливается по формуле n=n*24;

«-ctime n» – ищем по времени смены статуса или созданию конкретного файла или папки;

«-amin n» – папки/файлы, которые были использованы определенное время (n) назад (в минутах);

«cmin n» – папки/файлы с измененным статусом (создание, использование и т.п.) за определенное количество минут назад (параметр n);

«mmin n» – папки/файлы с измененным статусом (создание, использование и т.п.) за определенное количество секунд назад (параметр n).

Также, поиск легко ограничивается владельцем директории или файла. Для этого существует ключ -user:

find . -name *.jpg -user Ivan

Данная конструкция позволяет найти все JPG изображения пользователя с именем Ivan.

Однако просто искать чаще всего недостаточно. Над найденными файлами или папками можно сразу проводить определенные операции. Давайте познакомимся с примером, в котором все найденные по маске файлы будут удалены. Для этого будем работать с ключом -exec. Он предназначен для повторения определенного действия над каждым результатом выдачи:

find /aaa -type f -name tmp* -exec rm -f {} \;

Пояснения по конструкции:

«/aaa» – директория поиска /aaa;

«-type f» – ограничиваемся файлами, папки нам не нужны;

«-name tmp*» – имя файла должно начинаться на tmp, на месте звездочки могут быть любые символы;

«-exec rm -f {}» – удаляем каждый найденный по маске файл;

«{}» – список аргументов заменяется;

«\;» – логичный конец конструкции.

А вот еще один интересный пример, позволяющий установить нужные права для любых файлов, найденных в определенной папке:

find /home/nobody/public_html -type f -exec chmod 644 {} \;

Аналогично и для найденных папок:

find /home/nobody/public_html -type d -exec chmod 755 {} \;

Стоит отметить, что главный каталог /public_html также получит новые права, т.к. в результатах поиска он будет определяться текущим. Возвращаем ему правильные права простой командой:

chmod 750 public_html

Наконец, предлагаем пример более «продвинутой» работы с find. Тут мы ищем .htaccess и закрываем комментариями определенные php-переменные:

find /home/nobody/public_html -type f -name .htaccess -exec replace "php_admin_flag" "#php_admin_flag" -- {} \;

find /home/nobody/public_html -type f -name .htaccess -exec replace "php_flag" "#php_flag" -- {} \;

find /home/nobody/public_html -type f -name .htaccess -exec replace "php_admin_value" "#php_admin_value" -- {} \;

find /home/nobody/public_html -type f -name .htaccess -exec replace "php_value" "#php_value" -- {} \;

Также рекомендуем почитать:

Категории


Хостинг сайтов

Популярное в категории