Лучшие вопросы
Таймлайн
Чат
Перспективы
Find
Из Википедии, свободной энциклопедии
Remove ads
find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. Может производить поиск в одном или нескольких каталогах с использованием критериев, заданных пользователем. По умолчанию find возвращает все файлы в рабочем каталоге. Более того, find позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются регулярные выражения. Для поиска файлов по содержимому следует пользоваться утилитой grep.
Remove ads
Список ключей
-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.
Remove ads
Примеры
Суммиров вкратце
Перспектива
Поиск в текущем каталоге
Найти все файлы в текущем и дочерних каталогах, название которых начинается с 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
Поиск файлов по маске с исключением.
Ищет файлы php в текущем каталоге, исключая index.php
find . -name "*.php" ! -name "index.php"
Рекурсивное удаление файла от текущего каталога, на заданную глубину.
Удаляет все файлы 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'
Remove ads
Ссылки
find(1)— страница справки man по пользовательским командам GNU/Linux (англ.) (англ.)- «Как выловить битые ссылки» (недоступная ссылка) — с помощью find’а найти все битые ссылки. (рус.)
- Поиск файлов в Linux — разнообразные примеры использования команды find (рус.)
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads