Как найти файлы по маске linux

Очень важно уметь вовремя найти нужную информацию в системе. Конечно, все современные файловые менеджеры предлагают отличные функции поиска, но им не сравнится с поиском в терминале Linux. Он намного эффективнее и гибче обычного поиска, вы можете искать файлы не только по имени, но и по дате добавления, содержимому, а также использовать для поиска регулярные выражения.

Кроме того, с найденными файлами можно сразу же выполнять необходимые действия. В этой статье мы поговорим о поиске с помощью очень мощной команды find Linux, подробно разберем её синтаксис, опции и рассмотрим несколько примеров.

Команда find – это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.

Утилита find предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.

Команда find имеет такой синтаксис:

find [папка] [параметры] критерий шаблон [действие]

Папка – каталог в котором будем искать

Параметры – дополнительные параметры, например, глубина поиска, и т д

Критерий – по какому критерию будем искать: имя, дата создания, права, владелец и т д.

Шаблон – непосредственно значение по которому будем отбирать файлы.

Основные параметры команды find

Я не буду перечислять здесь все параметры, рассмотрим только самые полезные.

  • -P – никогда не открывать символические ссылки.
  • -L – получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
  • -maxdepth – максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
  • -depth – искать сначала в текущем каталоге, а потом в подкаталогах.
  • -mount искать файлы только в этой файловой системе.
  • -version – показать версию утилиты find.
  • -print – выводить полные имена файлов.
  • -type f – искать только файлы.
  • -type d – поиск папки в Linux.

Критерии

Критериев у команды find в Linux очень много, и мы опять же рассмотрим только основные.

  • -name – поиск файлов по имени.
  • -perm – поиск файлов в Linux по режиму доступа.
  • -user – поиск файлов по владельцу.
  • -group – поиск по группе.
  • -mtime – поиск по времени модификации файла.
  • -atime – поиск файлов по дате последнего чтения.
  • -nogroup – поиск файлов, не принадлежащих ни одной группе.
  • -nouser – поиск файлов без владельцев.
  • -newer – найти файлы новее чем указанный.
  • -size – поиск файлов в Linux по их размеру.

Примеры использования

А теперь давайте рассмотрим примеры find, чтобы вы лучше поняли, как использовать эту утилиту.

1. Поиск всех файлов

Показать все файлы в текущей директории:

find

find .

find . -print

Все три команды покажут одинаковый результат. Точка здесь означает текущую папку. В место неё можно указать любую другую.

2. Поиск файлов в определенной папке

Показать все файлы в указанной директории:

find ./Изображения

Искать файлы по имени в текущей папке:

find . -name "*.png

Поиск по имени в текущей папке:

find . -name "testfile*"

Не учитывать регистр при поиске по имени:

find . -iname "TeStFile*"

3. Ограничение глубины поиска

Поиска файлов по имени в Linux только в этой папке:

find . -maxdepth 1 -name "*.php"

4. Инвертирование шаблона

Найти файлы, которые не соответствуют шаблону:

find . -not -name "test*"

5. Несколько критериев

Поиск командой find в Linux по нескольким критериям, с оператором исключения:

find . -name "test" -not -name "*.php"

Найдет все файлы, начинающиеся на test, но без расширения php. А теперь рассмотрим оператор ИЛИ:

find -name "*.html" -o -name "*.php"

Эта команда найдёт как php, так и html файлы.

6. Тип файла

По умолчанию find ищет как каталоги, так и файлы. Если вам необходимо найти только каталоги используйте критерий type с параметром d. Например:

find . -type d -name "Загрузки"

Для поиска только файлов необходимо использовать параметр f:

find . -type f -name "Загрузки"

6. Несколько каталогов

Искать в двух каталогах одновременно:

find ./test ./test2 -type f -name "*.c"

7. Поиск скрытых файлов

Найти скрытые файлы только в текущей папке. Имена скрытых файлов в Linux начинаются с точки:

find . -maxdepth 1 -type f -name ".*"

8. Поиск по разрешениям

Найти файлы с определенной маской прав, например, 0664:

find . -type f -perm 0664

Права также можно задавать буквами для u (user) g (group) и o (other). Например, для того чтобы найти все файлы с установленным флагом Suid в каталоге /usr выполните:

sudo find /usr -type f -perm /u=s

Поиск файлов доступных владельцу только для чтения только в каталоге /etc:

find /etc -maxdepth 1 -perm /u=r

Найти только исполняемые файлы:

find /bin -maxdepth 2 -perm /a=x

9. Поиск файлов в группах и пользователях

Найти все файлы, принадлежащие пользователю:

find . -user sergiy

Поиск файлов в Linux принадлежащих группе:

find /var/www -group www-data

10. Поиск по дате модификации

Поиск файлов по дате в Linux осуществляется с помощью параметра mtime. Найти все файлы модифицированные 50 дней назад:

find / -mtime 50

Поиск файлов в Linux открытых N дней назад:

find / -atime 50

Найти все файлы, модифицированные между 50 и 100 дней назад:

find / -mtime +50 -mtime -100

Найти файлы измененные в течении часа:

find . -cmin 60

11. Поиск файлов по размеру

Найти все файлы размером 50 мегабайт:

find / -size 50M

От пятидесяти до ста мегабайт:

find / -size +50M -size -100M

Найти самые маленькие файлы:

find . -type f -exec ls -s {} ; | sort -n -r | head -5

Самые большие:

find . -type f -exec ls -s {} ; | sort -n | head -5

12. Поиск пустых файлов и папок

find /tmp -type f -empty

find ~/ -type d -empty

13. Действия с найденными файлами

Для выполнения произвольных команд для найденных файлов используется опция -exec. Например, для того чтобы найти все пустые папки и файлы, а затем выполнить ls для получения подробной информации о каждом файле используйте:

find . -empty -exec ls -ld {} ;

Удалить все текстовые файлы в tmp

find /tmp -type f -name "*.txt" -exec rm -f {} ;

Удалить все файлы больше 100 мегабайт:

find /home/bob/dir -type f -name *.log -size +100M -exec rm -f {} ;

Выводы

Вот и подошла к концу эта небольшая статья, в которой была рассмотрена команда find. Как видите, это одна из наиболее важных команд терминала Linux, позволяющая очень легко получить список нужных файлов. Ее желательно знать всем системным администраторам. Если вам нужно искать именно по содержимому файлов, то лучше использовать команду grep.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

find $HOME -name "hello.c" -print

This will search the whole $HOME (i.e. /home/username/) system for any files named “hello.c” and display their pathnames:

/Users/user/Downloads/hello.c
/Users/user/hello.c

However, it will not match HELLO.C or HellO.C. To match is case insensitive pass the -iname option as follows:

find $HOME -iname "hello.c" -print

Sample outputs:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Pass the -type f option to only search for files:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

The -iname works either on GNU or BSD (including OS X) version find command. If your version of find command does not supports -iname, try the following syntax using grep command:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

OR try

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Sample outputs:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 23 января 2020 года; проверки требуют 7 правок.

find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. Может производить поиск в одном или нескольких каталогах с использованием критериев, заданных пользователем. По умолчанию find возвращает все файлы в рабочем каталоге. Более того, find позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются регулярные выражения. Для поиска файлов по содержимому следует пользоваться утилитой grep.

Список ключей[править | править код]

  • -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.

Примеры[править | править код]

Поиск в текущем каталоге[править | править код]

Найти все файлы в текущем и дочерних каталогах, название которых начинается с my.

Обратите внимание: в понятиях unix файлом является все в том числе и каталоги.

Для поиска исключительно по именам файлов нужно использовать дополнительную опцию -type f 

find . -name 'my*' -type f

Поиск в определенном каталоге[править | править код]

Найти все файлы в корневом и дочерних каталогах, название которых начинается с 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' "{}" ;

Поиск в зависимости от времени создания[править | править код]

Найти и вывести список файлов во всей файловой системе, изменённых в течение последней минуты:

Найти и вывести список файлов во всей файловой системе, которые были изменены более 31 дня назад:

Поиск по размеру файла[править | править код]

Найти и вывести список файлов во всей файловой системе, чей размер больше 100 Мб:

find / -size +100M -print

Поиск файлов, принадлежащих определенному пользователю[править | править код]

В данном примере поиск осуществляется по файлам принадлежащим пользователю с именем 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'

Ссылки[править | править код]

  • find(1) — страница справки man по пользовательским командам GNU/Linux  (англ.)  (англ.)
  • «Как выловить битые ссылки»  (недоступная ссылка) — с помощью find’а найти все битые ссылки.  (рус.)
  • Поиск файлов в Linux — разнообразные примеры использования команды find (рус.)

марта 2022
Категория:
Bash

Справка по команде find в Linux для поиска файлов и каталогов.

Примеры поиска

find . -type f -name '*.php' -maxdepth 3 -exec grep 'video-search' {} +                 ## поиск по названию и содержимому
find ~/ -maxdepth 7 -type f -not -path '*/.*' -not -path '*/node_modules*' -name *.txt  ## поиск txt файлов по названию

Синтаксис команды:

find [-H -L -P] [-Oуровень] [-D help|tree|search|stat|rates|opt|exec] [путь...] [выражение]

Опции

Опции команды find:

find ./ -print0     Вывести пути к файлам и символ «NULL» в качестве разделителя.
find ./ -printf ''  Форматировать вывод.
find ./ -type ''    

Опции -printf:

%p     /home/user/Рабочий стол/file.txt     Путь к файлу
%h     /home/user/Рабочий стол/             Каталог файла
%f     file.txt                             Имя файла

%c     Mon Jan 13 16:13:53.8401175430 2020  Дата модификации
%C@    1578928478.3940218700    секунды.наносекунды с начала эпохи линукс 
%Cs    1578928478               секунды с начала эпохи (since 1970-01-01 00:00 GMT)

## Формат опций из команды date:
%TF    2020-01-13               Дата модификации
%TT    16:13:54.0081247250      Время модификации (добавляет nanoseconds)
%TY-%Tm-%Td %TH:%TM:%TS         Время создания/модификации файла. Аналог: %CY-%Cm-%Cd %CH:%CM:%CS

%g     root                     Группа владельца
%G     1000                     ID группы владельца
%u     root                     Имя пользователя/владельца
%U     1000                     ID пользователя/владельца
%m     600                      Биты прав доступа
%#m    0600                     Биты прав доступа с ведущим "0"
%M     -rw-------               Права доступа в символьной записи

## @see https://www.gnu.org/software/findutils/manual/html_mono/find.html#Location-Directives
Примечание

Если имена файлов могут содержать пробелы – нужно указывать опцию -print0:

find ./ -print0 | xargs -0
find ./ -print0   выводить полные имена файлов и символ «NULL» в качестве разделителя
xargs -0          задать символ "NULL" в качестве разделителя. По умолчанию "пробел" или "перенос строки"

Примеры

По типу

Поиск файлов по типу:

find ./ -type f   # Файлы. Типы файлов: f - файл, d - directory, l - link, p - pipe/канал, s - socket
find ./ -type d   # Каталоги

По названию

Шаблон имени:

find /public -name '*js'

Поиск файла по маске содержимого (regex):

// BASH CODE

Формат вывода

find ./ -type f -printf '"%p" %Csn'    # Вывести полный путь и timestamp модификации

По времени/дате

Время обращения/модификации файла в минутах:

find ./ -amin -30  # время последнего обращения менее 30 мин назад (access time)
find ./ -cmin -30  # время последнего изменения мета-данных менее 30 мин назад
find ./ -mmin -30  # время последней модификации/создания файла менее 30 мин назад

Время последнего обращения/модификации файла в днях:

find ./ -atime +2  # время последнего обращения к файлу более 2 дней
find ./ -ctime +2  # время последнего изменения владельца или прав доступа в днях
find ./ -mtime +2  # время последнего изменения/создания файла более 2 дней

Новее указанной даты:

find ./ -newermt "2019-10-13 06:47" # время изменения/создания файла больше указанной даты
find ./ ! -newermt '2021-05-27 10:00:00'  -print0
find ./ -newerat 2019-10-13         # время обращения к файлу больше указанной даты

Новее даты указанного файла:

find ./ -newer /tmp/sync_timestamp  # время изменения/создания файла больше чем дата модификации указанного файла

По размеру

find ./ -size +100к -size -50M  # больше 100 Кбайт но меньше 50 Мбайт
find ./ -size -900c             # меньше 900 байт

Команды

Примеры команд/операций над найденными файлами:

find some-dir/ -type f -print0 | xargs -0 echo                       ## Простой пример конвейерной обработки после find
find some-dir/ -type f -print0 | xargs -0 mv -t some-dir/dir         ## Переместить только файлы в каталог
find ./some-dir/ -name 'file-mask-*.txt' -exec rm -rf '{}'          ## Удалить файлы
find ./some-dir/ -name 'file-mask-*.txt' -exec chown www-data {} ;  ## Изменить владельца файлов

#find #grep #поиск файлов в linux

Практические примеры, которые приведены в этой статье, помогут вам освоить очень эффективную и крайне полезную команду find.

Она используется для поиска файлов и папок через командную строку Linux.

Команда find — одна из самых мощных и широко применимых команд. При этом она крайне объёмная и насчитывает более 50 опций, в которых легко запутаться, особенно в сочетании с командами exec или xargs.

Если вы сисадмин или разработчик, избежать команды find при работе с командной строкой не получится. Так что давайте научимся её не бояться и пользоваться её возможностями в полной мере.

Для этого разберём самые распространённые случаи практического применения команды find. Но для начала покажу вам синтаксис и принцип работы с командой.

Команда find в Linux

Общий синтаксис команды find выглядит так:

find [directory to search] [options] [expression]

Всё, что в квадратных скобках, указывать необязательно. А значит, выполнить команду find можно вообще без опций и параметров. Она выдаст список всех файлов и папок в текущем расположении. Мало полезного, да?

Так что давайте взглянем на параметры подробнее:

  • directory to search (папка поиска) — это расположение, с которого вы хотите начать поиск. Поиск по умолчанию рекурсивный и начинается с текущего расположения.
  • options (опции) содержит указание типа поиска: по имени, типу файла, времени изменения и так далее — тут может быть более 50 вариантов.
  • expression (выражение) содержит поисковый запрос. Если вы ищете файл по имени, параметр expression должен содержать имя файла. Если ищете файлы с именем, соответствующим заданному шаблону, поисковое выражение — это шаблон.

Приведу простой пример:

find . -type f -name myfile

Такая команда выполнит поиск файла (именно файла, не папки) с именем myfile в текущей папке и подпапках. Опция -type f сужает поиск до файлов. Точка (.) указывает на текущую папку.

Рассмотрим несколько примеров применения команды find.

Поиск файлов и папок по имени

Так выполняется поиск файлов и папок по имени:

find . -name SEARCH_NAME

Поскольку тип объекта не указан, команда выполняет поиск и файлов, и папок.

Пример ниже — поиск файлов и папок с именем «mystuff»:

abhishek@LHB:~/Examples$ find -name mystuff
./new/mystuff
./mystuff

Поиск только файлов или только папок

Если нужно искать только файлы, на помощь придёт опция type -f:

find . -type f -name SEARCH_NAME

Тип и имя можно указывать в любом порядке. Возьмём пример выше и ограничим круг поиска файлами:

abhishek@LHB:~/Examples$ find -type f -name mystuff
./mystuff

Если нужно найти папку, укажите тип type -d:

find . -type d -name SEARCH_NAME

Вот пример нашего поиска уже по папкам:

abhishek@LHB:~/Examples$ find -type d -name mystuff
./new/mystuff

Поиск без учёта регистра

Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, надо ввести опцию -iname вместо -name.

find . -type f -iname SEARCH_NAME

С поиском по папкам (type -d) это тоже работает.

abhishek@LHB:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff

Скриншот последних трёх примеров:

image

Поиск файлов по расширению (важно)

Одно из самых популярных применений команды find — поиск файлов определённого типа, то есть по заданному расширению.

Скажем, вы хотите найти все файлы С++ в текущих папках. Файлы С++ имеют расширение .cpp, и вот как их можно найти:

find . -type f -name "*.cpp"

С такими опциями команда find найдёт только файлы (-type f) с именами, оканчивающимися на .cpp.

abhishek@LHB:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp

При работе с командой find всегда заключайте поисковое выражение в двойные кавычки.

С чем связана рекомендация заключать поисковый запрос в двойные или одинарные кавычки? Дело в том, что без кавычек оболочка будет работать с символом * как с джокером и выполнит подстановку.

Вот что будет, если ввести запрос без кавычек:

find . -type f -name *.cpp

Оболочка распознает подстановочный знак * и заменит его всеми файлами в текущей папке, чьи имена заканчиваются на .cpp.

Это сработает, если такой файл всего один, но если их несколько, оболочка пожалуется на некорректный синтаксис.

image

В нашем случае файл .cpp всего один, и после подстановки команда выглядит так: find . -type f -name file.cpp. Она работает, поскольку file.cpp — корректный поисковый запрос.

А вот файлов .txt в той же папке два, и когда команда расширяется до find . -type f -name another.txt new.txt, выводится предупреждение, потому что поисковых запросов больше одного.

Именно поэтому сам поисковый запрос всегда следует заключать в двойные кавычки.

Поиск нескольких файлов с несколькими расширениями (или условием)

Команда, рассмотренная выше, нужна для поиска файлов по расширению. А что если нужно найти файлы с несколькими разными расширениями?

Вместо того чтобы прогонять команду find несколько раз, введите её один раз с опцией -o, которая работает как логическое условие «или»:

find . -type f -name "*.cpp" -o -name "*.txt" 

Например:

abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt

Поиск файлов в заданной папке

Все приведённые примеры иллюстрируют поиск в текущей папке, потому что команда включает в себя точку (.).

Чтобы выполнить поиск в заданной папке, не покидая текущего расположения, можно заменить точку абсолютным или относительным путём к нужной папке.

abhishek@LHB:~/Examples$ find ./new -name mystuff
./new/mystuff

Поиск файлов в нескольких папках

Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:

find ./location1 /second/location -type f -name "pattern"

Поиск пустых файлов и папок

Опция -empty позволяет использовать команду find для поиска пустых файлов и папок.

Найти таковые в текущей папке можно следующим образом:

find . -empty

Можно указать тип объектов, чтобы искать только файлы или только папки:

find . -empty -type f

Кроме того, можно в таком режиме искать файлы по имени:

find . -empty -type f -name "*.cpp"

image

Поиск крупных и мелких файлов (поиск по размеру файла)

Команда find поможет найти крупные или мелкие файлы, если выполнить поиск по размеру. Но это работает только для файлов, не для папок.

Используется опция -size с аргументом +N для файлов размером более N и -N для файлов размером менее N.

А вот как можно найти файлы точного заданного размера (50 КБ):

find . -size 50k

Так выполняется поиск файлов размером более 1 ГБ в текущей папке:

find . -size +1G

А так — файлов, не превышающих 20 байт:

find . -size -20c

Для поиска файлов размером более 100 МБ, но менее 2ГБ, введите:

find . -size +100M -size -2G

Поиск по размеру тоже можно сочетать с поиском по имени файла. Таким образом, найти в корневом каталоге все файлы размером более 500 МБ с именем, оканчивающимся на .log, можно так:

find / -size +500M -name "*.log"

Для справки:

  • c – байты
  • k – килобайты
  • M – мегабайты
  • G – гигабайты

Поиск недавно изменённых файлов (поиск по времени изменения или создания)

Вы ведь знакомы с параметрами mtime, atime и ctime?

  • Mtime – время последнего изменения файла
  • Ctime – время создания файла
  • Atime – время последнего доступа к файлу

Вы не раз столкнётесь с ситуацией, когда нужен список всех недавно изменённых файлов. В таких случаях на помощь приходит поиск по времени изменения.

Найти все файлы, претерпевшие изменения за последние трое суток (3*24ч), можно так:

find . -type f -mtime -3

А все файлы, созданные пять и более дней назад, ищутся так:

find . -type f -ctime +5

Понимаю, что 24 часа — большой срок. Что если нужно выявить файлы, изменённые всего пару минут назад? Для этого предусмотрены опции mmin, amin и cmin.

Так выглядит команда поиска всех файлов, изменённых за последние пять минут:

find . -type f -mmin -5

image

Можно не только указать имя файла, но и ограничить временной промежуток с двух сторон. Команда ниже выполнит поиск всех файлов .java, изменённых не ранее 30 и не позднее 20 минут назад.

find . -type f -mmin +20 -mmin -30 -name "*.java"

Поиск файлов с определёнными настройками доступа

Надеюсь, вы имеете представление о разрешениях файлов в Linux.

Команда find позволяет выполнить поиск файлов по разрешению и режиму доступа.

find -perm mode

Поищем в текущей папке, к примеру, все файлы с режимом доступа 777:

find . -perm 777

А так можно найти все файлы с правами на чтение и запись для всех типов пользователей (только точное совпадение; файлы с правами на выполнение для всех не отобразятся):

find . -perm a=r+w

Поиск файлов по владельцу

Можно также найти файлы, принадлежащие определённому пользователю.

Вот как обнаружить в текущей папке все файлы пользователя Джона:

find . -type f -user John

Эта опция сочетается с другими, будь то размер или время и имя файла:

find . -type f -user John -name "*.cpp"

Отключение рекурсивного поиска для поиска только в текущей папке

По умолчанию команда find выполняет поиск во всех подпапках текущего расположения. Если это не требуется, можно ограничить глубину поиска значением «1». Так вы ограничитесь поиском в текущей папке, не залезая в подпапки.

find . -maxdepth 1 -type f -name "*.txt"

image

Исключение папки из поиска

Если нет необходимости производить поиск в той или иной папке, можно исключить её с помощью опций path, prune и логического «или».

find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME

Будьте внимательны: путь к папке должен оканчиваться на *, затем идёт -prune и только потом -o.

Попросту говоря, при поиске с опцией prune папка, указанная с помощью path, игнорируется. Prune всегда сопровождается флагом -o (логическое «или»), чтобы папки, которые не были исключены, просматривались на наличие искомого объекта.

Дальнейшая работа с результатами команды find: exec и xargs

Итак, мы изучили различные способы поиска файлов по заданным параметрам. Это хорошо. А теперь следующий шаг: рассмотрим, какие действия можно выполнять с результатами команды find.

Например, как найти файлы с именем, соответствующим определённому шаблону, и переименовать их за одно действие? Или выявить и удалить пустые файлы?

Вам уже известно, что в Linux можно использовать перенаправление ввода-вывода, чтобы объединить результаты одной команды с вводом другой. Но с результатами команды find это не сработает — по крайней мере, не напрямую.

Чтобы выполнить действия над результатом команды find, есть два варианта:

  • Применить exec
  • Применить xargs

Использование find и exec

Допустим, вам нужен подробный список (ls -l) файлов, найденных командой find. Вот как его получить:

find . -type f -name "*.txt" -exec ls -l {} +

Результат будет таким:

abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt

Многие забывают ввести {} + в конце команды exec. Но это необходимо — как и пробел между скобками {} и плюсом +.

Фигурные скобки ссылаются на результат выполнения команды find. Их содержимое может иметь следующий вид: {файл 1, файл 2, файл 3}. Символ + используется как конец команды exec.

Есть ещё один вариант оформления exec:

find . -type f -name "*.txt" -exec ls -l {} ;

В данном случае плюс заменён на точку с запятой. Дополнительная косая черта означает, что точка с запятой не является специальным символом.

Преимущество сочетания {} + заключается в меньшем количестве команд ( ls -l file1 file2 file3), тогда как комбинация {} ; запустит цепочку ls -l file1, ls -l file2 и так далее.

Однако сочетание {} ; даёт возможность использовать {} несколько раз в одном и том же выражении exec. Так, приведённая ниже команда переименует все обнаруженные файлы с расширением .old.

find . -type f -name "*.txt" -exec mv {} {}.old ;

Использование команды xargs

Многие пользователи Linux сталкиваются с необходимостью перенаправления ввода-вывода довольно часто. Но команда exec с цепочкой символов {} + кажется им слишком сложной.

И тут на помощь приходит xargs. Нужно просто перенаправить вывод команды find в команду xargs через конвейер.

find . -type f -name "*.txt" | xargs ls -l

image

Синтаксис куда проще, верно? К тому же команда xargs тоже весьма эффективна. Подробнее о ней — в статье по ссылке.

Сочетание команд find и grep

Теперь вы умеете совмещать команду find с xargs и exec, и пора перейти на следующий уровень — объединить find и grep.

Для сисадминов и разработчиков комбинация команд find и grep — одна из самых распространённых и вместе с тем самых полезных.

Команда find находит файлы с именем, соответствующим шаблону, а затем команда grep выполняет поиск по их содержимому.

Например, вам нужно найти все файлы .txt, в которых есть имя «Alice». Объединить команды find и grep можно так:

find . -type f -name "*.txt" -exec grep -i alice {} +

А можно с помощью xargs:

find . -type f -name "*.txt" | xargs grep -i alice

image

Конечно, пример элементарный, но если команда grep вам знакома, можете использовать её на своё усмотрение.

И это далеко не все возможности команды find…

Перечислить все опции и примеры использования команды find практически невозможно. Её возможностям нет границ, но если вы освоите её принципы, она окажется очень кстати во многих ситуациях. Решающий фактор — как сочетается логика действия разных опций и команд.

Надеюсь, моя подборка примеров использования find была для вас полезна. Если у вас есть вопросы или предложения, как сделать эту статью лучше, добро пожаловать в комментарии.


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

— 20% на выделенные серверы AMD Ryzen и Intel Core — HABRFIRSTDEDIC.

Доступно до 31 декабря 2021 г.

Добавить комментарий