Эта статья — выдержка из книги «Linux&Unix — программирование в Shell» , Девида Тенсли.
Правки вносил немного в спешке, если замечены опечатки — пишите в комментарии.
Часто в процессе работы возникает необходимость осуществить поиск файлов с определенными характеристиками, такими как права доступа, размер, тип и т.д. Команда find представляет собой универсальный инструмент поиска: она позволяет искать файлы и каталоги, просматривать все каталоги в системе или только текущий каталог.
В этой главе рассматриваются следующие темы, связанные с применением команды find :
Параметры команды find ;
Примеры использования различных опций команды find ;
Примеры совместного использования команд xargs и find .
Возможности команды find обширны, велик и список предлагаемых опций. В настоящей главе описаны наиболее важные из них. Команда find может проводить поиск даже на дисках NFS (Network File System - сетевая файловая система), конечно, при наличии соответствующих разрешений. В подобных случаях команда обычно выполняется в фоновом режиме, поскольку просмотр дерева каталога требует значительных затрат времени. Общий формат команды find таков:
find путевое_имя -опции
где путевое_имя - это каталог, с которого необходимо начинать поиск. Символ ‘.’ служит для обозначения текущего каталога, символ / - корневого каталога, а символ «~» - записанного в переменной $HOME начального каталога текущего пользователя.
2.1. Опции команды find
Остановимся на описании основных опций команды find .
Name Поиск файлов, имена которых соответствуют заданному шаблону
Print Запись полных имен найденных файлов в стандартный поток вывода
Perm Поиск файлов, для которых установлен указанный режим доступа
Prune Применяется для того, чтобы команда find не выполняла рекурсивный поиск по уже найденному путевому имени; если указана опция -depth , опция -prune игнорируется
User Поиск файлов, принадлежащих указанному пользователю
Group Поиск файлов, которые принадлежат данной группе
Mtime -n +n Поиск файлов, содержимое которых модифицировалось менее чем (-) или более чем (+) n дней назад; имеются также опции -atime и -ctime , которые позволяют осуществлять поиск файлов соответственно по дате последнего чтения и дате последнего изменения атрибутов файла
Nogroup Поиск файлов, принадлежащих несуществующей группе, для которой, иначе говоря, отсутствует запись в файле /etc/groups
Nouser Поиск файлов, принадлежащих несуществующему пользователю, для которого, другими словами, отсутствует запись в файле /etc/passwd
Newer файл Поиск файлов, которые созданы позднее, чем указанный файл
Type Поиск файлов определенного типа, а именно: b - специальный блочный файл; d - каталог; с - специальный символьный файл; p - именованный канал; l - символическая ссылка; s - сокет; f - обычный файл
Size n Поиск файлов, размер которых составляет n единиц; возможны следующие единицы измерения: b - блок размером 512 байт (установка по умолчанию); с - байт; k - килобайт (1024 байта); w - двухбайтовое слово
Depth При поиске файлов сначала просматривается содержимое текущего каталога и лишь затем проверяется запись, соответствующая самому каталогу
F stype Поиск файлов, которые находятся в файловой системе определенного типа; обычно соответствующие сведения хранятся в файле /etc/fstab , который содержит данные о файловых системах, используемых на локальном компьютере
Mount Поиск файлов только в текущей файловой системе; аналогом этой опции является опция -xdev -exec Выполнение команды интерпретатора shell для всех обнаруженных файлов; выполняемые команды имеют формат команда { } ;
(обратите внимание на наличие пробела между символами {} и 😉
Ок Аналогична опции -exec , но перед выполнением команды отображается запрос
2.1.1. Опция -name
При работе с командой find
чаще всего используется опция -name
. После нее в кавычках должен быть указан шаблон имени файла.
Если необходимо найти все файлы с расширением.txt
в вашем начальном каталоге, укажите символ в качестве путевого имени. Имя начального каталога будет извлечено из переменной $HOME
.
$ find ~ -name «*.txt» -print
Чтобы найти все файлы с расширением .txt , находящиеся в текущем каталоге, следует воспользоваться такой командой:
$ find . -name «*.txt» -print
Для нахождения в текущем каталоге всех файлов, в именах которых встречается хотя бы один символ в верхнем регистре, введите следующую команду:
$ find . -name «*» -print
Найти в каталоге /etc файлы, имена которых начинаются с символов «host «, позволяет команда
$ find /etc -name «hoat*» -print
Поиск в начальном каталоге всех файлов с расширением .txt, а также файлов, имена которых начинаются с точки, производит команда
$ find ~ -name «*.txt» -print -о -name «.*» -print
Опция -о является обозначением операции логического ИЛИ. В случае ее применения помимо файлов с обычными именами будут найдены файлы, имена которых начинаются с точки.
Если вы хотите получить список всех файлов в системе, не имеющих расширения, выполните представленную ниже команду, но будьте осторожны, так как она может существенно замедлить работу системы:
$ find / -name «*» -print
Ниже показано, как найти все файлы, в именах которых сначала следуют символы нижнего регистра, а за ними - две цифры и расширение .txt (например, ах37.xt ):
$ find . -name » [а-х] [а-х] . txt» -print
2.1.2. Опция -perm
Опция -perm позволяет находить файлы с заданным режимом доступа. Например, для поиска файлов с режимом доступа 755 (их может просматривать и выполнять любой пользователь, но только владелец имеет право осуществлять запись) следует воспользоваться такой командой:
$ find . -perm 755 -print
Если перед значением режима вставить дефис, будет произведен поиск файлов, для которых установлены все указанные биты разрешений, остальные биты при этом игнорируются. Например, следующая команда ищет файлы, к которым другие пользователи имеют полный доступ:
$ find . -perm -007 -print
Если же перед значением режима введен знак «плюс», осуществляется поиск файлов, для которых установлен хотя бы один из указанных битов разрешений, при этом остальные биты игнорируются.
2.1.3. Опция -prune
Когда вы не хотите вести поиск в том или ином каталоге, воспользуйтесь опцией -prune . Она служит указанием остановить поиск на текущем путевом имени. Если путевое имя указывает на каталог, команда find не будет заходить в него. При наличии опции -depth опция -prune игнорируется.
Следующая команда проводит поиск в текущем каталоге, не заходя в подкаталог /bin:
$ find . -name «bin» -prune -о -print
2.1.4. Опции -user и —nouser
Чтобы найти файлы, принадлежащие определенному пользователю, укажите в команде find опцию -user , а также имя пользователя. Например, поиск в начальном каталоге файлов, принадлежащих пользователю dave , осуществляется посредством такой команды:
$ find ~ -user dave -print
Поиск в каталоге /etc файлов, принадлежащих пользователю uucp , выполняет следующая команда:
$ find /etc -uaer uucp -print
Благодаря опции -nouser возможен поиск файлов, принадлежащих несуществующим пользователям. При ее использовании производится поиск файлов, для владельцев которых нет записи в файле /etc/passwd . Конкретное имя пользователя указывать не нужно: команда find выполняет всю необходимую работу сама. Чтобы найти все файлы, которые принадлежат несуществующим пользователям и находятся в каталоге /home , задайте вот такую команду:
$ find /home -nouaer -print
2.1.5. Опции -group и -nogroup
Опции -group и -nogroup аналогичны опциям -user-nouser/apps всех файлов, которыми владеют пользователи группы accts :
$ find /арра -group accta -print
Следующая команда ищет во всей системе файлы, принадлежащие несуществующим группам:
$ find / -nogroup -print
2.1.6. Опция -mtime
Опцию -mtime следует применять при поиске файлов, доступ к которым осуществлялся х дней назад. Если аргумент опции снабдить знаком ‘-‘, будут отобраны файлы, к которым не было доступа в течение х дней. Аргумент со знаком ‘+’ приводит к противоположному результату - производится отбор файлов, доступ к которым осуществлялся на протяжении последних х дней.
Найти все файлы, которые не обновлялись в течение последних пяти дней, позволяет следующая команда:
$ find / -mtime -5 -print
Ниже приведена команда, выполняющая поиск в каталоге /var/adm файлов, которые обновлялись в течение последних трех дней:
$ find /var/adm -mtime +3 -print
2.1.7. Опция -newer
Если необходимо найти файлы, доступ к которым осуществлялся в промежутке времени между обновлениями двух заданных файлов, воспользуйтесь опцией -newer . Общий формат ее применения таков:
Newer старый_файл ! -newer новый_файл
Знак ‘! ‘ является оператором логического отрицания. Он означает: найти файлы, которые новее, чем старый_файл , но старее, чем новый_файл .
Предположим, у нас есть два файла, которые обновлялись с интервалом немногим более двух дней:
Rwxr-xr-x 1 root root 92 Apr 18 11:18 age.awk
-rwxrwxr-x 1 root root 1054 Apr 20 19:37 belts.awk
Для нахождения всех файлов, которые обновлялись позже, чем age.awk , но раньше, чем belts.awk , выполните следующую команду (применение опции -exec описано чуть ниже):
$ find . -newer age.awk ! -newer belts.awk -exec Is -1 {} ;
-rwxrwxr-x 1 root root 62 Apr 18 11:32 ./who.awk
-rwxrwxr-x 1 root root 49 Apr 18 12:05 ./group.awk
-rw-r-r- 1 root root 201 Apr 20 19:30 ./grade2.txt
-rwxrwxr-x 1 root root 1054 Apr 20 19:37 ./belts.awk
Но как быть, если необходимо найти файлы, созданные, скажем, в течение последних двух часов, а у вас нет файла, сформированного ровно два часа назад, с которым можно было бы сравнивать? Создайте такой файл! Для этой цели предназначена команда touch -t , которая создает файл с заданной временной меткой в формате ММДЦччмм (месяц-день-часы-минуты). Например:
$ touch -t 05042140 dstamp
$ ls -1 dstamp
-rw-r-r- 1 dave admin 0 May 4 21:40 dstamp
В результате будет получен файл, дата создания которого - 4 мая, время создания -21:40 (предполагается, что текущее время - 23:40). Теперь можно применить команду find с опцией -newer для нахождения всех файлов, которые обновлялись в течение последних двух часов:
$ find . -newer datamp -print
2.1.8. Опция -type
Операционные системы UNIX и Linux поддерживают различные типы файлов. Поиск файлов нужного типа осуществляется посредством команды, find с опцией -type . Например, для нахождения всех подкаталогов в каталоге /etc воспользуйтесь такой командой:
$ find /etc -type d -print
Чтобы получить список всех файлов, но не каталогов, выполните следующую команду:
$ find . ! -type d -print
Ниже приведена команда, которая предназначена для поиска всех символических ссылок в каталоге /etc .
$ find /etc -type 1 -print
2.1.9. Опция -size
В процессе поиска размер файла указывается с помощью опции -size N , где N - размер файла в блоках по 512 байтов. Возможные аргументы имеют следующие значения: +N - поиск файлов, размер которых больше заданного, -N - меньше заданного, N - равен заданному. Если в аргументе дополнительно указан символ с , то размер считается заданным в байтах, а не в блоках, а если символ k - в килобайтах. Для поиска файлов, размер которых превышает 1 Мб, предназначена команда
$ find . -aize -flOOOk -print
Следующая команда выполняет поиск в каталоге /home/apache файлов, размер которых в точности равен 100 байтам:
$ find /home/apache -sixe 100с -print
Произвести поиск файлов, размер которых превышает 10 блоков (5120 байтов), позволяет приведенная ниже команда:
$ find . -size +10 -print
2.1.10. Опция Опция -depth
Опция -depth
позволяет организовать поиск таким образом, что сначала проверяются все файлы текущего каталога (и рекурсивно все его подкаталоги) и только в конце - запись самого каталога. Эта опция широко применяется при создании списка файлов, помещаемых в архив на магнитной ленте с помощью команды cpio
или tar
, так как в этом случае сначала записывается на ленту образ каталога и лишь после этого задаются права доступа к нему. Это позволяет пользователю архивировать те каталоги, для которых у него нет разрешения на запись.
Следующая команда выводит список всех файлов и подкаталогов текущего каталога:
$ find . -name «*» -print -о -name «.*» -print -depth
Вот как могут выглядеть результаты ее работы:
./.Xdefaults ./.bash_logout ./.bash_profile ./.bashrc ./.bash_nistory ./file ./Dir/filel ./Dir/file2 ./Dir/file3 ./Dir/Subdir/file4 ./Dir/Subdir ./Dir
2.1.11. Опция -mount
Поиск файлов только в текущей файловой системе, исключая другие смонтированные файловые системы, обеспечивает опция -mount команды find . В следующем примере осуществляется поиск всех файлов с расширением .хс в текущем разделе диска:
$ find / -name «*.ХС» -mount -print
2.1.12. Поиск файлов с последующей архивацией командой cpio
Команда cpio применяется главным образом для записи файлов на магнитную ленту и чтения их с ленты. Очень часто она используется совместно с командой find , по каналу принимая от нее список файлов.
Вот как выполняется запись на магнитную ленту содержимого каталогов /etc , /home и /apps :
$ cd /
$ find etc home appa -depth -print | cpio -ov > dev/rmtO
Опция -о команды cpio задает режим записи файлов на ленту. Опция -v (verbose - словесный режим) является указанием команде cpio сообщать о каждом обрабатываемом файле.
Обратите внимание на то, что в именах каталогов отсутствует начальный символ ‘/’. Таким образом задаются относительные путевые имена архивируемых каталогов, что при последующем чтении файлов из архива позволит воссоздавать их в любой части операционной системы, а не только в корневом каталоге.
2.1.13. Опции -exec и -ok
Предположим, вы нашли нужные файлы и хотите выполнить по отношению к ним определенные действия. В этом случае вам понадобится опция -exec (некоторые системы позволяют с помощью опции -exec выполнять только команды ls или ls -1 ). Многие пользователи применяют опцию -exec для нахождения старых файлов, подлежащих удалению. Я рекомендую вместо команды rm выполнить сначала команду ls , чтобы убедиться в том, что команда find нашла именно те файлы, которые нужно удалить.
После опции -exec следует указать выполняемую команду, а затем ввести фигурные скобки, пробел, обратную косую черту и, наконец, точку с запятой. Рассмотрим пример:
$ find . -type f -exec Xa -1 (} ;
-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/C80
-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Normal
-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Rewid
Здесь выполняется поиск обычных файлов, список которых отображается на экране с помощью команды ls -1.
Чтобы найти файлы, которые не обновлялись в каталоге /logs в течение последних пяти дней, и удалить их, выполните следующую команду:
$ find /log» -type f -mtime +5 -exec rm {} ;
Следует соблюдать осторожность при перемещении и удалении файлов. Пользуйтесь опцией -ok , которая позволяет выполнять команды mv и rm в безопасном режиме (перед обработкой очередного файла выдается запрос на подтверждение). В следующем примере команда find находит файлы с расширением .log , и если какой-то файл создан более пяти дней назад, она удаляет его, но сначала просит вас подтвердить эту операцию:
$ find . -name «*.LOG» -mtime +5 -ok rm (} ;
< rm … ./nets.LOG > ? у
Для удаления файла введите у , а для предотвращения этого действия - n .
2.1.14. Дополнительные примеры использования команды find
Рассмотрим еще несколько примеров, иллюстрирующих применение команды find . Ниже показано, как найти все файлы в своем начальном каталоге:
$ find ~ -print
Найти все файлы, для которых установлен бит SUID , позволяет следующая команда:
$ find . -type f -perm +4000 -print
Чтобы получить список пустых файлов, воспользуйтесь такой командой:
$ find / -type f -size 0 -exec Is -1 {} ;
В одной из моих систем каждый день создается системный журнал аудита. К имени журнального файла добавляется номер, что позволяет сразу определить, какой файл создан позже, а какой - раньше. Например, версии файла admin.log нумеруются последовательно: admin.log.001, admin.log.002 и т.д. Ниже приведена команда find , которая удаляет все файлы admin.log , созданные более семи дней назад:
$ find /logs -name ‘admin.log.1 -atima +7 exec rm {} ;
2.2. Команда xargs
При наличии опции -exec команда find передает указанной команде все найденные файлы, которые обрабатываются за один раз. К сожалению, в некоторых системах длина командной строки ограниченна, поэтому при обработке большого числа файлов может быть выдано сообщение об ошибке, которое обычно гласит: «Too many arguments» (слишком много аргументов) или «Arguments too long» (слишком большой список аргументов). В этой ситуации на помощь приходит команда xargs . файлы, полученные от команды find , она обрабатывает порциями, а не все сразу.
Рассмотрим пример, в котором команда find возвращает список всех файлов, имеющихся в системе, а команда xargs выполняет для них команду file , проверяющую тип каждого файла:
$ find / -type f -print I xarge.file
/etc/protocols: English text /etc/securetty: ASCII text
Ниже приведен пример, демонстрирующий поиск файлов дампа, имена которых команда echo помещает в файл /tmp/core.log .
$ find / -name core -print | xarge echo > /tmp/core.log
В следующем примере в каталоге /apps/audit выполняется поиск всех файлов, к которым другие пользователи имеют полный доступ. Команда chmod удаляет для них разрешение на запись:
$ find /appe/audit -perm -7 -print | xarge chmod o-w
Завершает наш перечень пример, в котором команда grep ищет файлы, содержащие слово «device «:
$ find / -type f -print | xarge grep «device»
2.3. Заключение
Команда find представляет собой прекрасный инструмент поиска различных файлов по самым разнообразным критериям. Благодаря опции -exec , а также команде xargs найденные файлы могут быть обработаны практически любой системной командой.
Возможно, вам известна такая проблема как: Не можете найти файл, а он где то в компьютере. Тогда удобна команда find.
Вы спросите: Как ею пользоваться? К этой программе дается огромная man-страница, мы рассмотрим некоторые обычные случаи.
Можно начать с самого простого: Если вы знаете имя файла, то вы сможете легко его найти! Вам всего лишь нужно набрать команду find и указать конкретное имя файла!
Linux поиск файлов по имени
Вот эта та самая простая команда:Find -name love
Если существует файл с именем «love» то команда find выявит местоположение файла или нескольких файлов таким образом:
Jzb@kodos:~$ find -name love
./projects/love
jzb@kodos:~$
Например, будем искать все файлы в формате mp3 и сделаем полный список в файле:
File /home/artix -iname ".mp3" > ./list.txt
Поиск файлов по части названия
Далее найдем файлы в формате txtx, не просто файлы, а такие текстовые файлы, в которых присутствует слово «LEON»:File /home/artix -iname ".txt" -exec grep -H "LEON" "{}" \; > ./list.txt
Замечательно, у нас уже получается осуществлять поиск файлов Linux со словом
«LEON». Таким же образом можно удалить лишнее, причем в фоне, чтобы можно было дальше работать:
File /home/artix -iname ".bak" -exec rm "{}" \; &
Этим мы облегчаем себе жизнь. Эти наипростейшие вещи, а в них так много полезного.
Поиск файлов по дате Linux
Find ./ -mmin -10 #дата модификации менее 10 минут find ./ -mtime +1 #дата модификации более суток find ./ -type f -atime +10 # время обращения более 10 дней find ./ -type f -amin -10 #дата модификации последние 10 минут
Поиск текста в файлах Linux
Часто бывает что требуется провести поиск текста в файлах Linux. Приведу 2 примера поиска файлов: (linux, freebsd) нужно фрагмента текста в файлах: # find /var/named/ -type f -exec grep "MX" {} \;
serversnetwork.info. 14400 IN MX 10 mail
и еще один:
# grep -rl "MX" /var/named/ /var/named/serversnetwork.info.db
Поиск файлов по размеру
Временами для поиска файлов Linux можно пользоваться другими командами. Например, вы заметили как на вашем компьютере, в какой-то раздел стал увеличиваться в объеме. Чтобы найти с каким файлом это связанно, или какая папка переполняется можно использовать такую команду:Find -size 95k.
Так мы найдем файлы размером 95k. Но этой опцией пользуются очень редко. Больше используют команды, с помощью которых можно найти файл больше или меньше указанного размера. К примеру, опция:
Find -size +150k
Должна показать файлы которые больше 150k. А опция
Find -size -94k
то, что меньше 94K.
Функция -size производит поиск файлов указанного размера и имеет вот этот вид при выполнении:
$ find . -size 3500k -print
Эта опция осуществит в Linux поиск файлов и выявит на экране
те, у которых размер 3500 килобайт, которые находятся в этой папке. Если вам потребуется отыскать файлы, в которых размер меньше 250 килобайт, то команда будет выглядеть следующей:
$ find . -size -200k -print
Если требуется отыскать файлы в которых размер больше 555 мегабайт, то мы будем использовать опцию:
$ find / -size +555M -print
Пожалуй, на этом я закончу писать свою статью.
Теперь вы возможно сможете сами искать файлы, осуществлять поиск текста в файлах Linux, искать файлы по дате!
Всем спасибо, пока!
- Введите -iname вместо -name , чтобы проигнорировать регистр в веденном имени файла. Команда -name учитывает регистр.
-
Начните поиск в корневом каталоге. Чтобы запустить поиск по всей системе, к запросу добавьте модификатор / . В этом случае команда find будет искать файл во всех каталогах, начиная с корневого.
find / -iname "имя файла"
- Можно начать поиск в определенном каталоге; для этого замените / на путь к каталогу, например, /home/max .
- Можно использовать. вместо / , чтобы искать файл только в текущем каталоге и его подкаталогах.
-
Используйте символ обобщения . * , чтобы найти файлы, имя которого соответствует части запроса. При помощи символа обобщения * можно найти файл, полное имя которого неизвестно, или найти все файлы с определенным расширением.
find /home/max -iname "*.conf"
- Эта команда найдет все файлы с расширением.conf в папке пользователя Max (и ее подпапках).
- Воспользуйтесь этой командой, чтобы найти все файл, имена которых соответствуют части запроса. Например, если на компьютере хранится множество файлов, связанных с WikiHow, найдите все файлы, введя "*wiki*" .
-
Облегчите управление результатами поиска. Если результатов поиска слишком много, среди них сложно найти нужный файл. Используйте символ | , чтобы результаты поиска фильтровались командой less. Это облегчит просмотр и фильтрование результатов поиска.
find /home/max -iname "*.conf" | less
Найдите конкретные элементы. Используйте модификаторы, чтобы в результатах поиска отобразить только определенные элементы. Можно искать обычные файлы (f), каталоги (d), символьные ссылки (l), устройства посимвольного ввода-вывода (с) и блочные устройства (b).
find / -type f -iname "имя файла"
-
Отфильтруйте результаты поиска по размеру файлов. Если на компьютере хранится множество файлов с похожими именами, но размер искомого файла известен, отфильтруйте результаты поиска по размеру файлов.
find / -size +50M -iname "имя файла"
- Эта команда найдет все файлы, размер которых превышает 50 МБ. Используйте модификатор + или - , чтобы указать на увеличение или уменьшение размера. Если модификатора + или - нет, команда найдет файлы, размер которых точно совпадает с указанным размером.
- Результаты поиска можно отфильтровать по байтам (c), килобайтам (k), мегабайтам (M), гигабайтам (G) или блокам по 512 байт (b). Обратите внимание, что приведенные модификаторы учитывают регистр.
-
Используйте логические операторы (булевы операторы), чтобы объединить поисковые фильтры. Можно использовать операторы -and , -or , -not , чтобы объединить различные поисковые запросы в один запрос.
find /travelphotos -type f -size +200k -not -iname "*2015*"
- Эта команда найдет файлы в папке «Travelphotos», размер которых больше 200 кБ и в именах которых нет числа 2015.
Найдите файл по его имени. Такой простейший поиск выполняется при помощи утилиты find . Приведенная ниже команда будет искать файл в текущем каталоге и во всех его подкаталогах.
find -iname "имя файла"
В Linux есть очень мощная и полезная команда для поиска файлов — команда find
. Она обладает большим количеством возможностей для поиска файлов, однако, иногда вызывает сложности у новичков во многом из-за ее синтаксиса.
Простой пример использования команды find
Для начала рассмотрим простой пример использования команды find для поиска на компьютере файлов с именем config . Мы будем искать файлы config , начиная с корневого каталога / . Для этого вам нужно выполнять команду от имени пользователя root , чтобы иметь достаточно прав доступа, иначе получите сообщения «Permission denied». Итак, выполним команду:
Find / -name config -print
Команда означает следующее: искать файлы с именем config (-name config), начиная с каталога / (первый параметр команды find) и выводить имена файлов на экран (аргумент -print). Отмечу, что поиск рекурсивный, то есть при поиске просматриваются все вложенные директории. Как видите все просто. Теперь рассмотрим синтаксис команды и перейдем к обзору ее основных аргументов.
Синтаксис команды find
Общий синтаксис команды find , который вы можете найти в справочном руководстве, может показаться не совсем простым, поэтому я приведу более удобный для восприятия:
find [путь] [опции] [критерии поиска] [действия над файлами]
Путь
В качестве пути для поиска можно использовать как абсолютные, так и относительные пути, а также список путей, разделенных пробелом.
Опции
Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.
Критерии поиска
У команды find может быть несколько критериев поиска (их также называют tests). Каждый критерий представляет собой определенное условие проверки, которое возвращает либо true либо false . Это можно сравнить с условиями оператора if в программировании. В процессе обработки очередного файла команда find по очереди проверяет каждый критерий, и если очередной критерий возвращает false , тогда команда find переходит к следующему файлу. Критериев у команды find довольно много, мы рассмотрим только некоторые из них.
-atime N | Последний раз к файлу обращались N дней назад. |
-mtime N | Последнее изменение файла было N дней назад. |
-name шаблон | Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки. |
-newer другой_файл | Файл был изменен позже, чем другой_файл. |
-size [±] N | Размер файла равен N блокам, если указано +N , тогда размер файла больше N , -N — меньше. Символ после N означает размер блока. b — 512 байт, с — байт, w — 2 байта, k — килобайт, M — мегабайт, G — гигабайт. |
-type C | Файл типа C . Наиболее часто используемые значения для С: d — каталог, f — файл. |
-user Имя_пользователя | Файл принадлежит пользователю с именем Имя_пользователя. |
Примеры использования команды find с использованием критериев
Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».
Find . -type f -name "~*" -print
Найти в текущем каталоге файлы, измененные позже, чем файл file.bak .
Find . -newer file.bak -type f -print
Операторы
Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.
В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.
Примеры использования команды find с использованием операторов
Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f), а не каталогами.
Find . \(-name "~*" -or -name "temp*" \) -type f -print
Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).
Find . -maxdepth 1 \(\(-size +600M -and -size -1G \) -or -name "*.mpeg" \) -and -type f
Действия над файлами
Когда выполняется команда find , вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.
В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.
Примеры использования команды find с использованием действий
Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).
Find . -size +1000c -type f -ls
Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).
Find . -name "~*" -type f -ok rm {} \;
Заключение
В заметке мы рассмотрели очень важную и полезную Linux команду find , которая предоставляет практически неограниченные возможности для поиска файлов по многим критериям и шаблонам. А с использованием команд (действий) вы можете искать файлы и выполнять над ними любые операции.
Проблема с поиском нужных файлов или папок была, есть, и будет актуальна всегда. Люди постоянно забывают, куда именно они сохранили нужный файл Хрень.doc, или Супер-музня.mp3. Поэтому независимо от вашей операционной системы, поиск файлов или директорий, будет всегда востребован хоть на Linux, на Windows, или MacOS X. Просто инструменты поиска будут разные. Поиск в Linux можно разделить на две категории: графический и консольный. Начнем с гордости всех луниксоидов — с Терминала. Для поиска в Linux есть замечательная программа, под названием find
.
Формат написания команды find:
find путь к директории, в которой нужно сделать поиск -опции(ключи)
где путь – это каталог, в котором произвести поиск. Можно указывать следующие пути:
.
– произвести поиск в текущем каталоге;
/
– произвести поиск от корневого каталога, т.е. во всей системе;
~
– произвести поиск в домашнем каталоге.
Хотя путь конечно же может, и будет отличаться. Вверху лишь указаны стандартные пути.
Итак, самые главные опции команды find выглядят так:
—name
— поиск файлов по имени;
—user
— поиск файлов, которые принадлежат указанному пользователю;
—group
— поиск файлов, которые принадлежат указанной группе;
—perm
— поиск файлов с указанным режимом доступа;
—type
— поиск файлов какого-нибудь типа.
Типов тоже достаточно:
- b – специальный блочный файл;
- d – каталог;
- c – специальный символьный файл;
- f – обычный файл;
- l – символическая ссылка;
- p – именованный канал;
- s – сокет.
Size n
— поиск файлов, размер которого равен n единиц;
-mtime -n +n
– поиск файлов, которые изменяли свое содержание меньше чем (-) либо больше чем (+) дней назад.
А теперь несколько примеров применения команды find.
Самой применяемой опцией является -name, которая ищет файлы по имени.
Например, команда:
find ~ Music -name "*.mp3"
произведет поиск всех файлов (символ *), которые имеют расширение.mp3 в папке Music, которая находится в вашей Домашней директории.
find / -name "*.pdf"
Данная команда произведет поиск файлов с расширением.pdf во всех каталогах, куда вам разрешен доступ. Если программа не может зайти в некоторые системные каталоги, то она вас об этом предупредит. А если вам все таки нужно просмотреть полностью все каталоги, тогда используйте права Суперпользователя:
sudo find / -name "*.pdf"
find ~ -name "Foto*"
выведет список файлов домашнего каталога, начинающихся с букв Foto.
Ключ `-name’ различает большие и маленькие буквы; для того чтобы во время поиска не обращать внимание на эти критерии, нужно использовать опцию ‘-iname’. Тогда программа найдет все файлы, которые будут состоять из букв: Foto, foto или FOTO.
Если хотите, чтобы результат поиска был сохранен в текстовый файл, то команда примет следующий вид:
find ~ -name "Foto*" > results.txt
Если вам известно полное имя файла, тогда команда будет следующая:
find / -name .profile
В данном случае будет произведен поиск скрытого файла.profile во всей системе.
Можно произвести поиск файла если известна часть его имени. В таком случае команда будет такой:
find /home/dm/Музыка/Клипы/ -name "*uniform*"
Если вы хотите найти файлы, которые начинаются с каких-то определенных букв (например, от a до c), то в таком случае лучше применить регулярные выражения, которые очень удобны в работе:
find / -name "*"
Данная команда сможет найти все файлы вашей системы, которые начинаются с букв от a до c.
Поиск файлов с определенными режимами доступа
Если вы захотите отыскать файлы, которые имеют определенные режимы доступа, то помочь вам в этом сможет опция -perm. Например, найдем файлы, у которых режим доступа равен 775, и находятся в текущем каталоге:
find . -perm 775
Поиск файлов по пользователю, либо группе.
Чтобы найти файл, который принадлежит определенному пользователю достаточно выполнить следующую команду:
find / -user comp
Эта команда найдет файлы в системе, которые принадлежат пользователю comp.
А для того, чтобы найти файлы, которые принадлежат какой-то определенной группе (например group2), выполним команду:
find / -group group2
Чтобы найти файлы несуществующих пользователей либо групп, нужно использовать опции -nouser и -nogroup:
find / -nouser
find / -nogroup
Поиск файлов определенного типа
У команды find есть еще одна полезная возможность, можно найти файлы определенного типа. Для этого применим ключ -type. Найдем символические ссылки в каталоге /etc:
find /etc -type l
Найдем список каталогов, которые присутствуют в папке /mnt/raid
find /mnt/raid -type d
Поиск файлов по размеру.
Ключ -size дает возможность найти файлы нужного вам размера.
find . -size 2000k
Данная команда найдет и покажет на экране файлы, размер которых равен 2 мегабайта, и которые находятся в текущем каталоге. А если например нужно отыскать файлы размером менее 500 килобайт, то в таком случае команда будет такой:
find . -size -500k
Если вам нужно отыскать файлы с размером более 900 мегабайт, то команда будет следующей:
find / -size +900M
Поиск файлов с использованием ключа -mtime
Ключ -mtime дает возможность вам отыскать файлы, которые изменялись в какой-то определенный срок времени.
Например, у нас есть задача найти файлы, которые находятся в папке /home/dm/Video , и которые изменялись за последние 10 дней.
find /home/dm/Video -mtime +10
Если вам нужно наоборот, например, найти файлы, которые не изменялись неделю, тогда команда будет следующей:
find /home/dm/Video -7
В следующей статье я напишу о графических инструментах поиска в Ubuntu Linux.