shell команда find

find — shell команда для поиска файлов и каталогов в иерархии каталогов.  Рассмотрим некоторые способы использования этой команды и несколько ее опций поиска.

Самый простой пример нахождения файла по имени с помощью команды find:

find . -name test

после написания find пишем путь к папке, где надо искать, мы указали точку, то есть искать в текущем каталоге. Дальше ключ -name используется для поиска по имени, после его следует имя папки или файла, который мы ищем.В данном примере мы указали команде искать файл по названию test в текущем каталоге (. — точка это обозначение текущего каталога)

find . -iname test

— тот же поиск по имени, но без учета регистра в названии файлов.

Но, дело в том, что в примере выше мы не указали, что ищем именно файл, по тому, если в текущем каталоге или его подкаталоге существует папка из названием test, то она тоже попадет в результаты поиска. Для указания того, что мы ищем именно файл, и что названия папок в результаты поиска включать не надо, используем ключ «-type»

find . -type f -name test

«-type f» — мы указали, что ищем именно файл (f)
Для того, чтобы в результат включить одни папки с названием test, а файлы не искать, используем
«-type d»

find . -type d -name test

А что, если нам надо найти все файлы с расширением «.db», тогда используем звездочку «*».
* — заменяет любой набор символов. И того, для поиска всех файлов с расширением «.db» в каталоге /var/named используем следующую команду:

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

Тут мы заменили каталог для поиска на /var/named.

Если надо найти файлы или папки по дате их создания или последнего доступа к ним, используем ключ «-atime» — поиск по дате последнего доступа к файлу (или же его созданию, если никто к нему еще не доступался).

find . -type f -atime 1

Мы указали что ищем все фалы в текущем каталоге, которые были созданы или же к ним последний раз доступались за прошлые сутки, то есть больше чем 24 часа и меньше чем 48 часов назад. «-atime n» — считается n*24, то есть в нашем случае 1*24=24 часа назад, и команда ищет именно сколько 24-часовых периодов назад доступались к файлу.

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

find . -type f -atime +1

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

find . -type d -atime +2

Все файлы, к которым доступались за последние сутки:

find . -type f -atime -1

По этому же принципу можем использовать ключи
«-ctime n» — по дате создания или изменения статуса файла или папки
«-mtime n» — поиск файлов, которые были изменены(редактированы, или созданы) n*24 часов назад
«-amin n» — файлы или папки, к которым доступались n минут назад
«-cmin n» — файлы или папки, статус которых был изменен(или были они созданы) n минут назад
«-mmin» — файлы или папки, которые были изменены(или созданы) n минут назад

Можно производить поиск файлов и каталогов по их владельцу(юзеру), используя ключ «-user»:

find . -name *.jpg -user nobody

Мы указали что ищем в текущем каталоге все файлы с расширением .jpg, у которых стоит владелец nobody

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

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

«/tmp» — указываем что ищем файлы в папке /tmp
«-type f» — ищем только файлы и каталоги в результат поиска не включать
«-name sess*» — все файлы, имя которых начинается из слова «sess»
«-exec rm -f {}» — запустить команду «rm -f»(удаление) для каждого файла
«{}» — заменяет список найденных аргументов
«\;» — конец команды (в данном случае использования «find» указывать обязательно)

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

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 в аккаунте и закоментировать пхп переменные в нем:

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" -- {} \;

20 comments on “shell команда find

  1. Berg 15.05.2009 13:19

    Very nice examples! 🙂

  2. volos_86 29.01.2010 00:37

    Что значит следующее «{}» – заменяет список найденных аргументов ??
    Я так понял команда find ищет заданные файлы и директории во вех папках и подпапках начиная с той в которой она запущена?

  3. admin 29.01.2010 02:22

    ««{}» – заменяет список найденных аргументов». Это значит, что с помощью команды find, допустим Вы нашли три файла, вот названия этих трех файлов и будут аргументами. То есть вместо {} подставляются названия файлов по очереди.

    Нет. Как видите, сразу после слова find мы указываем в какой директории нужно искать.

  4. volos_86 29.01.2010 02:44

    а можно ли прописать команду что бы менялись атрибуты для всех файлов в этой папке и всех файлов в подпапках?

  5. admin 30.01.2010 02:46

    chattr -R <атрибуты> <имя папки>

    -R — означает менять рекурсивно на все подпапки и файлы внутри

  6. volos_86 30.01.2010 02:48

    точно, совсем забыл… (захотелось ругнутся)

  7. Sammy 17.05.2010 17:28

    А возможно ли сделать поиск только в определенном каталоге? не включая вложенные в него подкаталоги и содержащиеся в них файлы?

  8. admin 18.05.2010 20:01

    ls -d — команда покажет все папки в текущем каталоге
    grep (http://unixblog.org.ua/shell/grep/) — выборка по фразе

    Теперь совместим и получится:

    ls -d | grep dir_name

    так мы выберем все папки в текущем каталоге в названии которых встречается dir_name

    ls /tmp | grep name

    так мы выберем файлы и папки в каталоге /tmp, в имени которых содержится name (кроме сткрытых файлов, которые начинаются с точки)

  9. volos_86 18.05.2010 20:04

    Когда будут новые посты?

  10. admin 18.05.2010 20:13

    согласен, немного закинул блог………. скоро исправлюсь 😉

  11. Max 15.07.2010 22:04

    Давай испрявляйся, интересно епт)))

  12. krolik 10.04.2012 10:59

    так и не понял как задать чтоб отобразил папку в которой найден файл

  13. admin 21.04.2012 11:18

    так при поиске файлов, find показывает полный путь к файлу, в котором и видно папку

  14. Seotop 24.04.2012 13:37

    Очень полезная статья. Но, никак немогу найти команду для поиска именно «фразы» внутри файлов (будь то .txt, .php и т.п.). Подскажите пожалуйста.

  15. admin 25.04.2012 20:30

    посмотрите в этой статье:
    http://unixblog.org.ua/shell/grep/

    grep -rli <фраза> <каталог где искать>
    — покажет Вам все файлы которые содержат фразу

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>