Поиск файлов по имени/расширению
Основное применение команды поиска. Ищем файл (учитывается регистр букв) по имени в текущей директории (каталоге) и во всех поддиректориях.
# find -name "MyCProgram.c"
./backup/MyCProgram.c
./MyCProgram.c
Найти в домашнем каталоге все файлы PowerPoint (.ppt). Обратите внимание, что мы поместили шаблон имени файла в кавычки, чтобы оболочка не развернула его. Мы хотим передать команде именно аргумент *.ppt, а о соответствии шаблону пусть заботится find
.
$ find ~ -name '*.ppt'
Найдём все файлы в системе, начинающиеся на top
$ find / -name 'top*'
Найдём список файлов системы, имена которых начинаются с букв top, за которыми следуют еще три символа:
$ find / -name 'top???'
Чтобы получить список файлов системы, имена которых начинаются с букв top, за которыми следуют пять и более символов, введите:
$ find / -name 'top?????*'
Чтобы увидеть все файлы в каталоге /usr/share, содержащие в имени слово farm, введите:
$ find /usr/share -name '*farm*'
Найти обыкновенные файлы (здесь конкретизирован тип), содержащие в имени foo.
find . -type f -iname "*foo*”
Более гибкий, но сложный способ. После –qi
можно использовать регулярные выражения.
find . -type f -exec grep -qi "foo” {} ; -print
Используйте -regex
вместо -name
для поиска файлов, имена которых удовлетворяют регулярному выражению, или образцу, описывающему несколько строк. Чтобы увидеть все файлы в текущем каталоге, имена которых содержат строку net или comm, наберите:
$ find . -regex '.*(net|comm).*'
Примечание: Опция -regex
совпадает с полным именем файла относительно указанного каталога, а не с отдельным именем файла.
Список всех файлов текущего каталога, имена которых содержат строку invoice:
$ ls *invoice*
Список всех файлов со строкой invoice в имени, которые содержатся в текущем каталоге и во всех его подкаталогах:
$ ls */*invoice*
Расширяем диапазон поиска до желаемого уровня:
$ ls *invoice* */*invoice* */*/*invoice*
Утилита slocate найдет все файлы, имена которых содержат строку invoice. Так как slocate использует индексированный список имен файлов, то работает она с молниеносной быстротой. Этот индекс формируется программой updatedb (то же самое делает команда slocate с ключом -u), обычно запускаемой раз в день с помощью cron или anacron. В дистрибутиве Ubuntu 7.04 база данных slocateнаходится в файле /var/lib/slocate/slocate.db. Это единственный недостаток slocate — команда не найдет файлы, которые были созданы после последнего запуска updatedb.
$ slocate invoice
Примечание: s в названии команды slocate восходит к слову «безопасный» ('secure'). И вот в чем здесь дело: программа updatedb (которая строит индекс) работает с привилегиями администратора, чтобы иметь доступ ко всем файлам. Поэтому в индексе slocate.db могут быть файлы, невидимые обычным пользователям (например, системные файлы или личные файлы других пользователей). Индекс slocateвключает информацию о владельце файла и правах доступа, и программа slocate не покажет те файлы, соваться в которые вам не полагается. Раньше была еще программа locate, не отличавшаяся такой щепетильностью, но в современных дистрибутивах Linux slocate и locate указывают на одну и ту же утилиту.
Поиск файла по имени без учета регистра букв
Находит все имена с MyCProgram.c без учёта регистра (прописных и строчных букв) в текущей директории и во всех поддиректориях.
$ find -iname "MyCProgram.c"
./mycprogram.c
./backup/mycprogram.c
./backup/MyCProgram.c
./MyCProgram.c
Найти подкаталоги определённого владельца
В разделе «что искать» может быть несколько условий, и по умолчанию они объединяются через «логическое И», то есть при поиске отбираются файлы, для которых выполняются все условия. К примеру, поищем подкаталоги в /var, владельцем которых является daemon:
$ find /var -type d -user daemon
Опция -group
подобным образом определяет файлы, принадлежащие некоторой группе пользователей. Чтобы вывести список файлов в каталоге /dev, принадлежащих группе audio, введите:
$ find /dev -group audio
Ещё вариант поиска по нескольким критериям
Вы можете определить несколько опций find
одновременно, чтобы найти файлы, удовлетворяющие сразу нескольким критериям.
Чтобы вывести список файлов в домашнем каталоге, имена которых начинаются со строки `top', и которые новее файла /etc/motd, введите:
$ find ~ -name 'top*' -newer /etc/motd [Enter]
Чтобы сжать все файлы в Вашем домашнем каталоге, размер которых превышает 2 Mb, и которые еще не сжаты с помощью gzip (не имеют расширения .gz), введите:
$ find ~ -size +2000000c -regex '.*[^gz]' -exec gzip '{}' ';'
Вариативный поиск: соответствие одному из условий
Объединим условия по «ИЛИ» вместо объединения по «И». В каталоге /etc мы ищем либо файлы, владельцем которых является cupsys, либо пустые файлы:
$ find /etc -user cupsys -or -size 0