Часто в процессе работы возникает необходимость осуществить поиск файлов с определенными характеристиками, такими как права доступа, размер, тип и т. д. Команда find представляет собой универсальный инструмент поиска: она позволяет искать файлы и каталоги, просматривать все каталоги в системе или только текущий каталог.
В этой главе рассматриваются следующие темы, связанные с применением команды find:
• параметры команды find;
• примеры использования различных опций команды find;
• примеры совместного использования команд xargs и find .
Возможности команды find обширны, велик и список предлагаемых опций. В настоящей главе описаны наиболее важные из них. Команда find может проводить поиск даже на дисках NFS (Network File System -cетевая файловая система), конечно, при наличии соответствующих разрешений. В подобных случаях команда обычно выполняется в фоновом режиме, поскольку просмотр дерева каталогов требует значительных затрат времени.
Общий формат команды find таков:
find путевое_имя -oпции
где путевое_имя — это каталог, с которого необходимо начинать поиск. Символ '.' служит для обозначения текущего каталога, символ '/' — корневого каталога, а символ '~' — записанного в переменной $НОМЕ начального каталога текущего пользователя.
2.1. Опции команды find
Остановимся на описании основных опций команды find . Таблица 2.1. Основные опции команды find
-name
Поиск файлов, имена которых соответствуют заданному шаблону
Запись полных имен найденных файлов в стандартный поток вывода
-perm
Поиск файлов, для которых установлен указанный режим доступа
-prune
Применяется для того, чтобы команда find не выполняла рекурсивный поиск по уже найденному путевому имени; если указана опция -depth, опция -prune игнорируется
-user
Поиск файлов, принадлежащих указанном пользователю
-group
Поиск файлов, которые принадлежат данной группе
-mtime -n +n
Поиск файлов, содержимое которых модифицировалось менее чем (-) или более чем (+) n дней назад; имеются также опции -atime и -ctime, которые позволяют осуществлять поиск файлов соответственно по дате последнего чтения и дате последнего изменения атрибутов файла
-nogroup
Поиск файлов, принадлежащих несуществующей группе, для которой, иначе говоря, отсутствует запись в файле /etc/groups
-nouser
Поиск файлов, принадлежащих несуществующему пользователю, для которого, другими словами, отсутствует запись в файле
/etc/passwd
-newer файл
Поиск файлов, которые созданы позднее, чем указанный файл
-type
Поиск файлов определенного типа, а именно:
b -cпециальный блочный файл;
d — каталог;
с -cпециальный символьный файл;
p — именованный канал;
1 -cимволическая ссылка;
s -cокет;
f -oбычный файл
-size n
Поиск файлов, размер которых составляет n единиц; возможны
следующие единицы измерения:
b — блок размером 512 байтов (установка по умолчанию);
c — байт;
k — килобайт (1024 байта);
w — двухбайтовое слово
-depth
При поиске файлов сначала просматривается содержимое текущего каталога и лишь затем проверяется запись, соответствующая самому каталогу
-fstype
Поиск файлов, которые находятся в файловой системе определенного типа; обычно соответствующие сведения хранятся в файле /etc/fstab, который содержит данные о файловых системах, используемых на локальном компьютере
-mount
Поиск файлов только в текущей файловой системе; аналогом этой опции является опция -xdev
-exec
Выполнение команды интерпретатора shell для всех обнаруженных
файлов; выполняемые команды имеют формат
команда {} \;
(обратите внимание на наличие пробела между символами {} и
-ok
Аналогична опции -exec, но перед выполнением команды отображается запрос
При работе с командой find чаще всего используется опция -name. После нее в кавычках должен быть указан шаблон имени файла.
Если необходимо найти все файлы с расширением txt в вашем начальном каталоге, укажите символ '~' в качестве путевого имени. Имя начального каталога будет извлечено из переменной $номе.
$ find ~ -name "*.txt" — print
Чтобы найти все файлы с расширением txt, находящиеся в текущем каталоге, следует воспользоваться такой командой:
$ find . — name "*.txt" — print
Для нахождения в текущем каталоге всех файлов, в именах которых встречается хотя бы один символ в верхнем регистре, введите следующую команду:
$ find . — name "[A-Z]*" — print
Найти в каталоге /etc файлы, имена которых начинаются с символов "host", позволяет команда
$ find /etc -name "host*" — print
Поиск в начальном каталоге всех файлов с расширением txt, а также файлов, имена которых начинаются с точки, производит команда
$ find ~ -name "*.txt" — print -o -name ".*" — print
Опция -o является обозначением операции логического ИЛИ. В случае ее применения помимо файлов с обычными именами будут найдены файлы, имена которых начинаются с точки.
Если вы хотите получить список всех файлов в системе, не имеющих расширения, выполните представленную ниже команду, «о будьте осторожны, так как она может существенно замедлить работу системы:
$ find / -name "*" — print