Find: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 1: Строка 1:
{{заголовок со строчной буквы}}<code>'''find'''</code> — утилита поиска файлов по имени и другим свойствам, используемая в [[UNIX]]‐подобных [[операционная система|операционных системах]]. Может производить поиск в одном или нескольких [[Каталог (файловая система)|каталогах]] с использованием критериев, заданных [[Пользователь|пользователем]]. По умолчанию <code>find</code> возвращает все [[файл]]ы в рабочем каталоге. Более того, <code>find</code> позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются [[регулярные выражения]]. Для поиска файлов по содержимому следует пользоваться утилитой [[grep]].
{{заголовок со строчной буквы}}
<code>'''find'''</code> — утилита поиска файлов по имени и другим свойствам, используемая в [[UNIX]]‐подобных [[операционная система|операционных системах]]. Может производить поиск в одном или нескольких [[Каталог (файловая система)|каталогах]] с использованием критериев, заданных [[Пользователь|пользователем]]. По умолчанию <code>find</code> возвращает все [[файл]]ы в рабочем каталоге. Более того, <code>find</code> позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются [[регулярные выражения]]. Для поиска файлов по содержимому следует пользоваться утилитой [[grep]].


== Список ключей ==
* <code>-amin</code> — время последнего обращения к файлу (в минутах).
*<code>-amin</code> — время последнего обращения к файлу (в минутах).
* <code>-atime</code> — время последнего обращения к файлу (в днях).
* <code>-atime</code> — время последнего обращения к файлу (в днях).
* <code>-cmin</code> — время последнего изменения владельца или прав доступа к файлу (в минутах).
* <code>-cmin</code> — время последнего изменения владельца или прав доступа к файлу (в минутах).
Строка 30: Строка 30:
* <code>-type</code> — тип искомого: f=файл, d=каталог (directory), l=ссылка (link), p=канал (pipe), s=сокет.
* <code>-type</code> — тип искомого: f=файл, d=каталог (directory), l=ссылка (link), p=канал (pipe), s=сокет.
* <code>-user</code> — владелец: имя пользователя или UID.
* <code>-user</code> — владелец: имя пользователя или UID.



== Примеры ==
== Примеры ==


=== Поиск в текущем каталоге ===
=== Поиск в текущем каталоге ===
Найти все файлы, начиная с текущего каталога, название которых начинается на ''my''.
Найти все файлы в текущем и дочерних каталогах, название которых начинается с ''my''.

<pre>find . -name 'my*'</pre>
'''Обратите внимание:''' в понятиях unix [[Типы файлов (UNIX)|файлом]] является все в том числе и каталоги.
<syntaxhighlight lang="bash">find . -name 'my*' </syntaxhighlight>
Для поиска исключительно по именам файлов нужно использовать дополнительную опцию <code>-type f</code> 
<syntaxhighlight lang="bash">
find . -name 'my*' -type f
</syntaxhighlight>


=== Поиск в определенном каталоге ===
=== Поиск в определенном каталоге ===
Найти все файлы, начиная с корневого каталога, название которых начинается на ''my''.
Найти все файлы в корневом и дочерних каталогах, название которых начинается с ''my''.
<pre>find / -name 'my*'</pre>


Поиск в корневом каталоге эквивалентен поиску по всему компьютеру.
Поиск в каталогах /usr/local/man и /opt/local/man файлов, название которых начинается на ''my''.
<syntaxhighlight lang="bash">
<pre>find /usr/local/man /opt/local/man -name 'my*'</pre>
find / -name 'my*'
</syntaxhighlight>

Поиск файлов в каталогах <code>/usr/local/man</code> и <code>/opt/local/man</code>
<syntaxhighlight lang="bash">
find /usr/local/man /opt/local/man -name 'my*'
</syntaxhighlight>


=== Поиск по нескольким именам файлов ===
=== Поиск по нескольким именам файлов ===
Найти все файлы, начиная с текущего каталога, название которых начинается на ''my'' или ''qu''. Обратите внимание, что по умолчанию все аргументы соединены с помощью ''логического и'' (опция '-a'). Если необходимо объединить несколько аргументов ''логическим или'' — используйте опцию '-o'.
Найти все файлы в текущем и дочерних каталогах, название которых начинается с ''my'' или ''qu''.
Обратите внимание, что по умолчанию все аргументы соединены с помощью ''[[Логическое И|логического и]]'' (опция <code>-a</code>, от {{Lang-en|and}}). Если необходимо объединить несколько аргументов ''[[Логическое ИЛИ|логическим или]]'' — используйте опцию <code>-o</code>, от {{Lang-en|or}}.
<syntaxhighlight lang="bash">
<pre>find . \( -name "my*" -o -name "qu*" \) -print</pre>
find . \( -name "my*" -o -name "qu*" \) -print
</syntaxhighlight>


=== Поиск нескольких типов файлов, используя регулярные выражения ===
=== Поиск нескольких типов файлов, используя регулярные выражения ===
Найти все графические файлы, начиная с текущем каталоге, используя регулярные выражения.
Найти все файлы в текущем и дочерних каталогах, расширение который совпадает с перечисленными.

<pre>find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"</pre>
Данный поиск осуществляется с помощью [[Регулярные выражения|регулярных выражений]].
<syntaxhighlight lang="bash">
find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"
</syntaxhighlight>
Предыдущий пример можно также записать с помощью регулярных выражений
<syntaxhighlight lang="bash">
find . -type f -regex "\(my\|qu\).*"
</syntaxhighlight>
=== Выполнение команды ===
=== Выполнение команды ===
Опция ''-exec'' выполняет следующую за ней команду и подставляет вместо ''{}'' текущий файл.
Опция ''-exec'' выполняет следующую за ней команду и подставляет вместо ''<code>{}</code>'' текущий файл. Найти все каталоги ниже указанного каталога и изменить им права доступа с помощью команды [[chmod]]:
<syntaxhighlight lang="bash">
Найти все каталоги ниже указанного каталога и изменить им права доступа:
<pre>find /path -type d -exec chmod 0755 {} \;</pre>
find /path -type d -exec chmod 0755 {} \;
</syntaxhighlight>
Опция -exec работает примерно в 10 раз медленнее, чем перенаправление вывода через xargs, поэтому данный код рекомендуется писать следующим образом:
Опция -exec работает примерно в 10 раз медленнее, чем перенаправление вывода через [[xargs]], поэтому данный код рекомендуется писать следующим образом:
<pre>find /path -type d | xargs chmod 0755</pre>
<syntaxhighlight lang="bash">
find /path -type d | xargs chmod 0755
</syntaxhighlight>


Однако каталоги с именами, содержащими пробелы, методом перенаправления через xargs обработаны не будут, поэтому следует использовать первый вариант, дополненный:
Однако каталоги с именами, содержащими пробелы, методом перенаправления через xargs обработаны не будут, поэтому следует использовать первый вариант, дополненный:
<syntaxhighlight lang="bash">
<pre>find /path -type d -exec chmod 0755 "{}" \;</pre>
find /path -type d -exec chmod 0755 "{}" \;
Или (что лучше) вот так (опция -- -0 позволяет обрабатывать аргументы, содержащие пробелы и кавычки, т.к. использует NULL ("\0") вместо символов-разделителей "пробел" и "перевод строки"):
</syntaxhighlight>
<pre>find /path -type d -print0 | xargs -0 chmod 0755</pre>
Или воспользоватся опцией <code>-print0</code> и <code>-0</code> позволяет обрабатывать аргументы, содержащие пробелы и кавычки:
<syntaxhighlight lang="bash">
find /path -type d -print0 | xargs -0 chmod 0755
</syntaxhighlight>


Поиск всех файлов php.ini от текущего каталога и замена текста в каждом найденном файле.
Поиск всех файлов php.ini в текущем каталоге и замена текста в каждом найденном файле с помощью команды [[sed]].
<syntaxhighlight lang="bash">
find . -name 'php.ini' -exec sed -i 's/log_errors = Off/log_errors = On/g' "{}" \;
find . -name 'php.ini' -exec sed -i 's/log_errors = Off/log_errors = On/g' "{}" \;
Сложный поиск в нескольких видах файлов и замен текста в каждом из них, от текущего каталога и ниже.
</syntaxhighlight>
find . -regex ".*\.\(php\|js\|css\)" -exec sed -i 's/\/bitrix\/templates\//\/local\/templates\//g' "{}" \;


Сложный поиск в нескольких видах файлов и замен текста в каждом из них, от текущего каталога и ниже.
<syntaxhighlight lang="bash">
find . -regex ".*\.\(php\|js\|css\)" -exec sed -i 's/\/bitrix\/templates\//\/local\/templates\//g' "{}" \;
</syntaxhighlight>
=== Поиск в зависимости от времени создания ===
=== Поиск в зависимости от времени создания ===
Вывести список файлов во всей файловой системе, изменённых в течение последней минуты:
Найти и вывести список файлов во всей файловой системе, изменённых в течение последней минуты:
<syntaxhighlight lang="bash">
<pre>find / -mmin -1 -print</pre>
find / -mmin -1 -print
</syntaxhighlight>


Вывести список файлов во всей файловой системе, которые были изменены более 31 дня назад:
Найти и вывести список файлов во всей файловой системе, которые были изменены более 31 дня назад:
<syntaxhighlight lang="bash">
<pre>find / -mtime +31 -print</pre>
find / -mtime +31 -print
</syntaxhighlight>


=== Поиск по размеру файла ===
=== Поиск по размеру файла ===
Вывести список файлов во всей файловой системе, чей размер больше 100 Мб:
Найти и вывести список файлов во всей файловой системе, чей размер больше 100 Мб:
<syntaxhighlight lang="bash">
<pre>find / -size +100M -print</pre>
find / -size +100M -print
</syntaxhighlight>
=== Поиск файлов, принадлежащих определенному пользователю ===
=== Поиск файлов, принадлежащих определенному пользователю ===
В данном примере поиск осущетвляется по файлам принаждежашим пользователю с именем ilya<syntaxhighlight lang="bash">
<pre>find . -user <userid></pre>
find . -user ilya
</syntaxhighlight>


=== Поиск файлов c ограничением глубины ===
=== Поиск файлов c ограничением глубины ===
Глубина поиска указывается относительно каталога, указанного в аргументе команды
Глубина поиска указывается относительно каталога, указанного в аргументе команды.

find . -maxdepth 4 -name 'restore.php'
Начинает поиск в папке <code>/var/www</code>, но не глубже <code>/var/www/*/*/*/*</code> .
<syntaxhighlight lang="bash">
find /var/www -maxdepth 4 -name 'restore.php'
</syntaxhighlight>


=== Поиск файлов с перечислением каталогов. ===
=== Поиск файлов с перечислением каталогов. ===
Ищет файлы в указанных каталогах.
Ищет файлы в указанных каталогах.
<syntaxhighlight lang="bash">
find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f
find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f
</syntaxhighlight>


=== Рекурсивное удаление файла от текущего каталога, на заданную глубину. ===
=== Рекурсивное удаление файла от текущего каталога, на заданную глубину. ===
Удаляет все файлы restore.php от текущего каталога, но не глубже 4 уровня вложенности относительно аргумента в командной строке
Удаляет все файлы <code>restore.php</code> от текущего каталога, но не глубже 4 уровня вложенности относительно аргумента в командной строке


Начинает поиск в папке /var/www, но не глубже /var/www/*/*/*/* и удаляет все файлы restore.php в найденном.
Начинает поиск в папке <code>/var/www</code>, но не глубже <code>/var/www/*/*/*/*</code> и удаляет все файлы <code>restore.php</code> в найденном.
<syntaxhighlight lang="bash">
find /var/www -maxdepth 4 -name 'restore.php' -exec rm -r {} \;
find /var/www -maxdepth 4 -name 'restore.php' -exec rm -r {} \;
</syntaxhighlight>


=== Игнорирование ошибок ===
=== Игнорирование ошибок ===
Если при поиске возникает ошибка (например — нет доступа чтения из каталога) то вывод команды становится менее информативным. [[Перенаправление (UNIX)|Перенаправьте вывод STDERR]] в [[:/dev/null|/dev/null]].
Если при поиске возникает ошибка (например — нет доступа чтения из каталога) то вывод команды становится менее информативным. [[Перенаправление (UNIX)|Перенаправьте вывод STDERR]] в [[:/dev/null|/dev/null]].
<syntaxhighlight lang="bash">
<pre>find / -name 'secret.keys' -print 2>/dev/null</pre>
find / -name 'secret.keys' -print 2>/dev/null
</syntaxhighlight>


Также можно использовать один из следующих вариантов:
Также можно использовать один из следующих вариантов:
<syntaxhighlight lang="bash">
<pre>find / -name "имя искомого файла" |& grep -v 'Отказано в доступе'</pre>
find / -name "имя искомого файла" |& grep -v 'Отказано в доступе'
</syntaxhighlight>


<syntaxhighlight lang="bash">
<pre>find / -name "имя искомого файла" |& grep -v 'Permission denied'</pre>
find / -name "имя искомого файла" |& grep -v 'Permission denied'
</syntaxhighlight>


== Ссылки ==
== Ссылки ==

Версия от 13:41, 23 января 2020

find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. Может производить поиск в одном или нескольких каталогах с использованием критериев, заданных пользователем. По умолчанию find возвращает все файлы в рабочем каталоге. Более того, find позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются регулярные выражения. Для поиска файлов по содержимому следует пользоваться утилитой grep.

Список ключей

  • -amin — время последнего обращения к файлу (в минутах).
  • -atime — время последнего обращения к файлу (в днях).
  • -cmin — время последнего изменения владельца или прав доступа к файлу (в минутах).
  • -ctime — время последнего изменения владельца или прав доступа к файлу (в днях).
  • -delete — удалять найденные файлы.
  • -depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
  • -empty — только пустые каталоги.
  • -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
  • -group — владелец: группа пользователя или GID.
  • -L — разворачивать символические ссылки.
  • -ls — генерирует вывод как команда ls -dgils.
  • -maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 1» ограничивает поиск текущим каталогом.
  • -mmin — время последнего изменения файла (в минутах).
  • -mount или -xdev — не переходить на другие файловые системы.
  • -mtime — время последнего изменения файла (в днях).
  • -name — искать по маске имени файла. Опция -name регистрочувствительная, то есть различает прописные и строчные буквы. Для поиска файлов без учета регистров воспользуйтесь опцией -iname.
  • -newer другой_файл — искать файлы, созданные позже, чем другой_файл.
  • -ok — перед выполнением команды, указанной в -exec, выдаёт запрос.
  • -P — не разворачивать символические ссылки (поведение по умолчанию).
  • -perm — указываются права доступа.
  • -print0 — выводит путь к текущему файлу на стандартный вывод, за которым следует символ ASCII NULL (код символа 0).
  • -print — показывает на экране найденные файлы.
  • -prune — используется, когда вы хотите исключить из поиска определённые каталоги.
  • -regex — искать по имени файла, используя регулярные выражения.
  • -regextype тип — указание типа используемых регулярных выражений.
  • -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
  • -type — тип искомого: f=файл, d=каталог (directory), l=ссылка (link), p=канал (pipe), s=сокет.
  • -user — владелец: имя пользователя или UID.


Примеры

Поиск в текущем каталоге

Найти все файлы в текущем и дочерних каталогах, название которых начинается с my.

Обратите внимание: в понятиях unix файлом является все в том числе и каталоги.

find . -name 'my*'

Для поиска исключительно по именам файлов нужно использовать дополнительную опцию -type f 

find . -name 'my*' -type f

Поиск в определенном каталоге

Найти все файлы в корневом и дочерних каталогах, название которых начинается с my.

Поиск в корневом каталоге эквивалентен поиску по всему компьютеру.

find / -name 'my*'

Поиск файлов в каталогах /usr/local/man и /opt/local/man

find /usr/local/man /opt/local/man -name 'my*'

Поиск по нескольким именам файлов

Найти все файлы в текущем и дочерних каталогах, название которых начинается с my или qu.

Обратите внимание, что по умолчанию все аргументы соединены с помощью логического и (опция -a, от англ. and). Если необходимо объединить несколько аргументов логическим или — используйте опцию -o, от англ. or.

find . \( -name "my*" -o -name "qu*" \) -print

Поиск нескольких типов файлов, используя регулярные выражения

Найти все файлы в текущем и дочерних каталогах, расширение который совпадает с перечисленными.

Данный поиск осуществляется с помощью регулярных выражений.

find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"

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

find . -type f -regex "\(my\|qu\).*"

Выполнение команды

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

find /path -type d -exec chmod 0755 {} \;

Опция -exec работает примерно в 10 раз медленнее, чем перенаправление вывода через xargs, поэтому данный код рекомендуется писать следующим образом:

find /path -type d | xargs chmod 0755

Однако каталоги с именами, содержащими пробелы, методом перенаправления через xargs обработаны не будут, поэтому следует использовать первый вариант, дополненный:

find /path -type d -exec chmod 0755 "{}" \;

Или воспользоватся опцией -print0 и -0 позволяет обрабатывать аргументы, содержащие пробелы и кавычки:

find /path -type d -print0 | xargs -0 chmod 0755

Поиск всех файлов php.ini в текущем каталоге и замена текста в каждом найденном файле с помощью команды sed.

find . -name 'php.ini' -exec sed -i 's/log_errors = Off/log_errors = On/g' "{}" \;

Сложный поиск в нескольких видах файлов и замен текста в каждом из них, от текущего каталога и ниже.

find . -regex ".*\.\(php\|js\|css\)" -exec sed -i 's/\/bitrix\/templates\//\/local\/templates\//g' "{}" \;

Поиск в зависимости от времени создания

Найти и вывести список файлов во всей файловой системе, изменённых в течение последней минуты:

find / -mmin -1 -print

Найти и вывести список файлов во всей файловой системе, которые были изменены более 31 дня назад:

find / -mtime +31 -print

Поиск по размеру файла

Найти и вывести список файлов во всей файловой системе, чей размер больше 100 Мб:

find / -size +100M -print

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

В данном примере поиск осущетвляется по файлам принаждежашим пользователю с именем ilya

find . -user ilya

Поиск файлов c ограничением глубины

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

Начинает поиск в папке /var/www, но не глубже /var/www/*/*/*/* .

find /var/www -maxdepth 4 -name 'restore.php'

Поиск файлов с перечислением каталогов.

Ищет файлы в указанных каталогах.

find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f

Рекурсивное удаление файла от текущего каталога, на заданную глубину.

Удаляет все файлы restore.php от текущего каталога, но не глубже 4 уровня вложенности относительно аргумента в командной строке

Начинает поиск в папке /var/www, но не глубже /var/www/*/*/*/* и удаляет все файлы restore.php в найденном.

find /var/www -maxdepth 4 -name 'restore.php' -exec rm -r {} \;

Игнорирование ошибок

Если при поиске возникает ошибка (например — нет доступа чтения из каталога) то вывод команды становится менее информативным. Перенаправьте вывод STDERR в /dev/null.

find / -name 'secret.keys' -print 2>/dev/null

Также можно использовать один из следующих вариантов:

find / -name  "имя искомого файла" |& grep -v 'Отказано в доступе'
find / -name  "имя искомого файла" |& grep -v 'Permission denied'

Ссылки

  • find(1) — страница справки man по пользовательским командам GNU/Linux  (англ.)  (англ.)