Команда find в Linux – Это команда для поиска файлов и каталогов на основе специальных условий. Find – это одна из наиболее важных и часто используемых утилит системы Linux.
Оглавление
Основная информация о Find
Find – это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.
Утилита предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.
Команда find имеет такой синтаксис:
find [папка] [параметры]критерийшаблон [действие]
Папка– каталог в котором будем искать
Параметры– дополнительные параметры, например, глубина поиска, и т д
Критерий– по какому критерию будем искать: имя, дата создания, права, владелец и т д.
Шаблон – непосредственно значение по которому будем отбирать файлы.
Основные параметры команды find
Я не буду перечислять здесь все параметры, рассмотрим только самые полезные.
- -P никогда не открывать символические ссылки
- -L – получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
- -maxdepth – максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
- -depth – искать сначала в текущем каталоге, а потом в подкаталогах
- -mount искать файлы только в этой файловой системе.
- -version – показать версию утилиты find
- -print – выводить полные имена файлов
- -type f – искать только файлы
- -type d – поиск папки в Linux
Синтаксис и параметры команды Find
- /v – Выводит все строки, не содержащие строку, заданную параметром строка.
- /c – Подсчет строк, содержащих строку, указанную параметром строка, и отображение общего количества.
- /n – Выводит номера строк перед самими строками.
- /i – Задает поиск без различия строчных и заглавных букв.
- “строка_поиска” – Обязательный параметр. Указывает группу символов, поиск которой будет производиться. Необходимо заключить параметр строка в кавычки (“строка”).
- [диск:][путь] ИмяФайла – Задает местоположение и имя файла, в котором будет производиться поиск заданной строки символов.
- /? – Отображение справки в командной строке.
Путь
В качестве пути для поиска можно использовать как абсолютные, так и относительные пути, а также список путей, разделенных пробелом.
Опции
Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.
-depth (или -d) | Поиск в подкаталогах перед поиском в самом каталоге. |
-L | При поиске следовать по символическим ссылкам. |
-maxdepth N | При поиске проверять не более чем N вложенных уровней каталогов. |
-mindepth N | Не проверять вложенные каталоги уровня N и меньше. |
-mount | Не искать в каталогах других файловых систем. |
2.1.1. Опция -name
При работе с командой find чаще всего используется опция -name. После нее в кавычках должен быть указан шаблон имени файла.
Если необходимо найти все файлы с расширением .txt в вашем начальном каталоге, укажите символ в качестве путевого имени. Имя начального каталога будет извлечено из переменной $HOME.
$ find ~ -name «*.txt» -print
Чтобы найти все файлы с расширением .txt, находящиеся в текущем каталоге, следует воспользоваться такой командой:
$ find . -name «*.txt» -print
Для нахождения в текущем каталоге всех файлов, в именах которых встречается хотя бы один символ в верхнем регистре, введите следующую команду:
$ find . -name «[A-Z]*» -print
Найти в каталоге /etc файлы, имена которых начинаются с символов «host«, позволяет команда
$ find /etc -name «hoat*» -print
Поиск в начальном каталоге всех файлов с расширением .txt, а также файлов, имена которых начинаются с точки, производит команда
$ find ~ -name «*.txt» -print -о -name «.*» -print
Опция -о является обозначением операции логического ИЛИ. В случае ее применения помимо файлов с обычными именами будут найдены файлы, имена которых начинаются с точки.
Если вы хотите получить список всех файлов в системе, не имеющих расширения, выполните представленную ниже команду, но будьте осторожны, так как она может существенно замедлить работу системы:
$ find / -name «*» -print
Ниже показано, как найти все файлы, в именах которых сначала следуют символы нижнего регистра, а за ними — две цифры и расширение .txt (например, ах37.xt):
$ find . -name » [а-х] [а-х] [0—9] [0—9] . 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
Критерии поиска
У команды find может быть несколько критериев поиска (их также называют tests). Каждый критерий представляет собой определенное условие проверки, которое возвращает либо true либо false. Это можно сравнить с условиями оператора if в программировании. В процессе обработки очередного файла команда find по очереди проверяет каждый критерий, и если очередной критерий возвращает false, тогда команда find переходит к следующему файлу. Критериев у команды find довольно много, мы рассмотрим только некоторые из них.
-atime N | Последний раз к файлу обращались N дней назад. |
-mtime N | Последнее изменение файла было N дней назад. |
-name шаблон | Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки. |
-newer другой_файл | Файл был изменен позже, чем другой_файл. |
-size [±]N[cwbkMG] | Размер файла равен 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
Операторы
Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.
Короткая форма оператораДлинная формаОписание
! критерий | -not | Отрицание (возвращает true, если критерийfalse) |
критерий1-a критерий2 | -and | Оператор И (true, если критерий1 и критерий2true) |
критерий1-o критерий2 | -or | Оператор ИЛИ (true, если критерий1 или критерий2true) |
В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.
Примеры использования команды 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, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.
-exec команда ; | Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой. |
-execdir команда ; | То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл. |
-ok команда ; | То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды. |
-okdir команда ; | То же что ok для execdir. |
Вывод имени файла на экран. | |
-ls | Выполнение команды ls -dils над текущим файлом. |
В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.
Примеры использования команды find с использованием действий
Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).
find . -size +1000c -type f -ls
Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).
find . -name “~*” -type f -ok rm {} ;
Примеры использования find с параметром exec
Поиск файлов и удаление их при помощи параметра exec является часто встречающимся вариантом использования этого параметра, но вам не нужно использовать exec для этих целей, так как более удачный вариант будет описан позднее.
Поиск всех файлов с расширением .old и их удаление: find / -name “*.old” -exec /bin/rm {} ; Поиск всех файлов, размер которых превышает 100 МБ и их удаление: find / -size +100M -exec /bin/rm {} ; Бывают и такие случаи, что программы “сходят с ума” и заполняют директории тысячами мелких файлов, при этом вы не сможете просто использовать команду rm * по той причине, что командная оболочка не в состоянии заменить символ * на имена всех этих файлов, зато в состоянии удалить эти файлы по очереди: find . -exec /bin/rm {} ; Помните, что вы не должны использовать эти примеры, поскольку для удаления файлов у GNU find есть параметр -delete, более безопасный, нежели “-exec /bin/rm {};”. Пример использования: find / -name “*.old” -delete
В старых системах Unix у вас не будет возможности использовать параметр -delete, поэтому альтернатив параметру -exec для удаления файлов в них не остается.
А теперь рассмотрим некоторые другие примеры использования программы find с параметром exec.
Рекурсивное изменение прав доступа для файлов, не затрагивающее директории.find ./ -type f -exec chmod 644 {} ;
При помощи параметра -type f вы можете вести поиск только файлов и просто изменять права доступа к каждому из них при помощи chmod.
Рекурсивное изменение владельца файлов с olduser на newuserfind / -user olduser -type f -exec chown newuser {} ;
В этом примере я использовал параметр -user как альтернативу параметру -uid.
Рекурсивное изменение прав доступа для всех директорийfind . -type d -exec chmod 755 {} ;
В этом примере я снова использовал параметр -type, но на этот раз с аргументом d для поиска директорий.
Пример использования команды find
Для начала рассмотрим простой пример использования команды find для поиска на компьютере файлов с именем config. Мы будем искать файлы config, начиная с корневого каталога /. Для этого вам нужно выполнять команду от имени пользователя root, чтобы иметь достаточно прав доступа, иначе получите сообщения «Permission denied». Итак, выполним команду:
find / -name config -print
Команда означает следующее: искать файлы с именем config (-name config), начиная с каталога / (первый параметр команды find) и выводить имена файлов на экран (аргумент -print). Отмечу, что поиск рекурсивный, то есть при поиске просматриваются все вложенные директории. Как видите все просто. Теперь рассмотрим синтаксис команды и перейдем к обзору ее основных аргументов.
1)Выведите списки всех файлов текущей директории и ее подкаталогов
Для того чтобы вывести списки всех файлов текущей директории и ее подкаталогов, мы можем использовать:
$ find
В качестве альтернативы, мы можем также использовать ‘find . ’, которая выдаст вам тот же результат.
2)Найдите все файлы и директории в вашей текущей рабочей директории
Если нужно найти только директории, то можно использовать:
$ find . -type d
Чтобы найти только файлы, а не директории:
$ find . -type f
3)Выведите список всех файлов определенной директории
Для того чтобы найти файлы из определенной директории надо ввести:
$ find /root
This command will look for all the files in /root directory.
4)Найдите файл по имени в директории
Для поиска файла по имени в определенной директории введите:
$ find /root -name “linuxtechi.txt”
Эта команда будет искать файл linuxtechi.txt в директории /root. Так же мы найти все файлы с расширением .txt:
$ find /root -name “*.txt”
5)Найдите файл во множестве директорий
Для поиска файлов во множестве директорий введите:
$ find /root /etc -name “linuxtechi.txt”
With this command, we can look for linuxtechi.txt file in /root & /etc directories.
С помощью этой команды мы можем найти файл linuxtechi.txt в директориях /root и /etc.
6)Найдите файл по имени без учета регистра
Ищите файлы без учета регистра с помощью -iname:
$ find /root -iname “Linuxtechi.txt”
В результате вы получите все файлы с названием linuxtechi.txt. При этом файлов может быть несколько, так как linuxtechi.txt будет равняться LINUXTECHI.txt .
7)Найдите все типы файлов отличные от упомянутого
Давайте предположим, что нам необходимо найти все файлы отличные от определенного типа файлов. Чтобы этого добиться вводим:
$ find /root -not -name “*.txt”
8)Найдите файлы по множеству признаков
Мы можем совмещать более чем одно условие при поиске файлов. Предположим, что нам нужны файлы с расширениями .txt и .html:
$ find . -regex “.*.(txt|html)$”
9)Найдите файлы с использованием условия OR
Так же мы можем совмещать несколько поисковых критериев, что приведет к поиску файлов на основе удовлетворения одному из условий. Делается это с помощью оператора OR:
$ find -name “*.txt” -o -name “linuxtechi*”
Заключение
Как вы убедились, в приведенных выше примерах показано то, что использование программы find с параметром exec позволяет вам выполнять довольно сложные задачи, при этом то обстоятельство, что вы можете выполнять заданное действие только над частью файлов, ставит вас в выигрышное положение.
[spoiler title=”Источники”]- https://losst.ru/komanda-find-v-linux
- http://Cmd4Win.ru/administrirovanie-computera/upravlenie-failami/33-find
- https://pingvinus.ru/note/command-find
- https://rtfm.co.ua/komanda-find-i-eyo-opcii-v-primerax/
- http://rus-linux.net/MyLDP/consol/exec-option-in-command-find.html
- https://omgubuntu.ru/25-primierov-ispolzovaniia-komandy-find-dlia-nachinaiushchikh-znakomstvo-s-linux/
Как перенаправить вывод ошибок команды find в файл “errors.txt”?
Например так: find ~/* -name “*.txt” -print > errors.txt