Команда 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" -- {} \;