Find: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
IDIB (обсуждение | вклад) |
IDIB (обсуждение | вклад) Нет описания правки |
||
Строка 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''. |
||
<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''. |
||
<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''. |
||
Обратите внимание, что по умолчанию все аргументы соединены с помощью ''[[Логическое И|логического и]]'' (опция <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"> |
|||
Найти все каталоги ниже указанного каталога и изменить им права доступа: |
|||
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 дня назад: |
|||
<syntaxhighlight lang="bash"> |
|||
<pre>find / -mtime +31 -print</pre> |
|||
find / -mtime +31 -print |
|||
</syntaxhighlight> |
|||
=== Поиск по размеру файла === |
=== Поиск по размеру файла === |
||
Найти и вывести список файлов во всей файловой системе, чей размер больше 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’а найти все битые ссылки. (рус.)
- Поиск файлов в Linux — разнообразные примеры использования команды find (рус.)