Перейти к содержимому

Как найти файл в linux

  • автор:

Как найти файл в Linux? Руководство по команде find с примерами

img

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

Поиск папок

Чтобы сделать поиск по папкам команде find нужно передать параметр type d. Таким образом мы скажем команде find вести поиск только по директориям:

$ find /path/to/search -type d -name "name-of-dir"

Руководство по команде find с примерами

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

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

$ find /path/to/search -name ".*"

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

Команда find дает возможность вести поиск файлов размером больше, меньше или равным указанному значению. Чтобы найти файл размером больше 10Мб нужно ввести команду:

$ find /path/to/search -size +10M

Для поиска файлов размером меньше указанного значения или равного ему нужно ввести следующие команды:

$ find /path/to/search -size -10M $ find /path/to/search -size 10M

Также есть возможность искать файлы размер которых находится в указанном промежутке.

$ find /path/to/search -size +100M -size -1G

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

Допустим нам нужно найти несколько файлов, указанные в списке, который хранится в виде файла с расширением .txt. Для этого мы можем воспользоваться комбинацией команд find и grep. Чтобы данная команда работала корректно, каждый шаблона поиска в списке должен начинаться с новой строки.

$ find /path/to/search | grep -f filelist.txt

Парметр f переданный команде grep означает файл и даёт нам возможность указать файл с шаблонами для поиска. В результате работы вышеуказанной команды система вернёт нам все файлы, название которых указаны в списке.

Найти файл, которого нет в списке

Так же в системе Linux есть возможность поиска, противоположная указанному выше. То есть мы можем искать файлы, которые не указаны в списке файлов. Для этого команде grep передадим параметр vf, что означает обратное сопоставление и вернет нам файлы, названий которых не найдёт в списке шаблонов.

$ find /path/to/search | grep -vf filelist.txt

Указываем максимальную глубину поиска

По умолчанию, команда find ищет файлы во всех директориях и поддиректориях. Допустим, если мы в качестве пути для поиска укажем корневую директорию «/», то система будет искать искомый файл по всему жесткому диску. Мы можем ограничить область поиска командой maxdepth указав ему насколько глубоко нужно искать файл.

$ find . -maxdepth 0 -name "myfile.txt"

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

$ find . -maxdepth 1 -name "myfile.txt"

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

Команда find также позволяет вести поиск по пустым файлам и директориям. Для этого команде добавляем флаг empty. Следующие две команды позволяют найти пустые файли и папки. Для поиска папок к строке поиске добавляет ключ d:

$ find /path/to/search -type f empty $ find /path/to/search -type d empty

Так же можно автоматически удалять найденные пустые файлы или папки. Следующая команда найдет и удалит все пустые файлы в указанной папке и всех подпапках:

$ find /path/to/search -type f -empty delete

Поиск самого большого файла или папки

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

$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -1

Заметьте, что при поиске мы прибегнули к двум другим удобным инструментам Linux: sort и tail. Sort отсортирует файл по их размеру, а tail покажет самый последний файл в списке, который и будет самым большим файлом/папкой. Мы можем изменить команду так, чтобы она выводила пять самых больших файлов для этого нужно воспользоваться следующей командой:

$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -5

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

$ find /path/to/search -type f -printf "%s %p " | sort -n | head -5

Чтобы найти самую большую папку по указанному пути нужно ввести команду указанную ниже:

$ find /path/to/search -type d -printf "%s %p " | sort -n | tail -1

Поиск файлов с атрибутом setuid

Атрибут setuid файла позволяет обычному пользователю запускать файлы от имени root-а. Такие файлы тоже легко найти с помощью команды find и нескольких параметров. Команда имеет два параметра, которые позволяют искать файлы с конкретными правами: -user и perm. Чтобы найти файлы, который можно запускать от имени root-а можем прописать команду:

$ find /path/to/search -user root -perm /4000

Как найти файл в Linux

На скриншоте мы добавили еще параметр exec чтобы ограничить вывод команды find. Полная команда выглядит так:

$ find /path/to/search -user root -perm /4000 -exec ls -l <> ;

Мы можем заменить root любым другим пользователем или просто опустить этот параметр и найти все файлы с правами запуска от имени root-а:

$ find /path/to/search -perm /4000

Поиск файлов с атрибутом sgid

Команда поиск файлов с атрибутом sgid почти такая же как и для SUID с той разницей, что вместо 4000 прописываем 2000:

$ find /path/to/search -perm /2000

Так же можем найти файлы, которые имеют оба указанных атрибута:

$ find /path/to/search -perm /6000

Исключение из вывода файлов и папок, к которым нет доступа

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

Permission denied

Этот случай особо актуален при поиске в корневой директории. Согласитесь сильно засоряет вывод, но этого можно избежать если перенаправить вывод stderr в stdout и передать grep для обработки. Следующей командой мы выведем все результаты работы команды find кроме строк, содержащих слова "Permission denied"^

$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"

Поиск файлов изменённых за последние X дней

Чтобы найти файлы, которые были изменены за указанный период времени используется параметр mtime. Ниже приведены несколько примеров для поиска файлов, изменённых за последний 30 дней, больше 30 дней и меньше чем за 30 дней:

$ find /path/to/search -type f -mtime 30 $ find /path/to/search -type f -mtime +30< $ find /path/to/search -type f -mtime -30

Чтобы вывести более детальную информацию о найденных файлах можно указать параметр exec:

$ find /path/to/search -type f -mtime -30 -exec ls -l <> ;

Сортировка результатов по времени

При необходимости отсортировать результате по времени можно воспользоваться параметром printf и утилитой sort:

$ find /path/to/search -printf "%T+ %p " | sort

По умолчанию sort упорядочивает файлы от старых к новым. Чтобы указать обратный порядок сортировки достаточно добавить ключ r к команде sort:

$ find /path/to/search -printf "%T+ %p " | sort r

Разница между locate и find

В системе Linux есть и другая команда, позволяющая вести поиск файлов locate. Но так как она не имеет таких параметров поиска, как find, она не очень гибка, но достаточно практична.

$ locate myfile.txt

Утилита locate ведёт поиск по базе, которая содержит все имена файлов, находящихся в системе. Так как команда locate не ищет указанный файл по всей системе, то она намного эффективней утилиты find. Но с другой стороны база данных этой утилиты обновляется раз в день, что не позволяет найти файлы, созданные раньше, чем 24 часов. Базу данных можно вручную обновлять командой updatedb.

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

Если же поиск ведётся в папке, где мало файлов, то лучше пользоваться командой find.

Нагрузка CPU командой find

При поиске по большим каталогам команда find может требовать больше ресурсов. Это должно по своей сути позволять более важным системным процессам иметь приоритет, но если необходимо, чтобы команда find употребляла меньше ресурсов машины, можно использовать команду ionice или nice.

Просмотреть состояние процессора можно командой:

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

$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"

А чтобы понизить приоритет использования CPU, нужно ввести следующую команду:

$ nice -n 19 find /path/to/search -name "myfile.txt"

Или можно эти две команды комбинировать, чтобы обеспечить низкий приоритет как для Ввода/Вывода, так и для CPU.

Команда find в Linux – мощный инструмент сисадмина

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

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

Данная команда будет очень полезна системным администраторам для:

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

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

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

$ find directory-to-search criteria action
  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

$ find . -name "s.txt" ./s.txt
  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

$ find . -iname "s.txt" ./s.txt ./S.txt

Для поиска всех изображений c расширением .png нужно использовать шаблон подстановки *.png:

$ find . -name "*.png" ./babutafb.png ./babutafacebook.png ./Moodle2.png ./moodle.png ./moodle/moodle1.png ./genxfacebook.png

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

$ find /home -name "*.png" find: `/home/babuta/.ssh': Permission denied /home/vagrant/Moodle2.png /home/vagrant/moodle.png /home/tisha/hello.png find: `/home/tisha/testfiles': Permission denied find: `/home/tisha/data': Permission denied /home/tisha/water.png find: `/home/tisha/.cache': Permission denied

Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.

find /home -name "*.jpg" 2>/dev/null /home/vagrant/Moodle2.jpg /home/vagrant/moodle.jpg /home/tisha/hello.jpg /home/tisha/water.jpg

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

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

$ find . -type d . ./.ssh ./.cache ./moodle

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

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • "+" — Поиск файлов больше заданного размера
  • "-" — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

$ find . -size +1G ./Microsoft_Office_16.29.19090802_Installer.pkg ./android-studio-ide-183.5692245-mac.dmg
Единицы измерения файлов:

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

Критерий -empty позволяет найти пустые файлы и каталоги.

$ find . -empty ./.cloud-locale-test.skip ./datafiles ./b.txt . ./.cache/motd.legal-displayed

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

$ find . -cmin -60 . ./a.txt ./datafiles

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

$ find . -cmin +60

Поиск по времени доступа

Критерий -atime позволяет искать файлы по времени последнего доступа.

$ find . -atime +180

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

Поиск по имени пользователя

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

$ find /home -user tisha 2>/dev/null

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

$ find /home -perm 777

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

$ find /home -user tisha -and -size +1G 2>/dev/null

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

$ find /home \( -user pokeristo -or -user tisha \) -and -size +1G 2>/dev/null

Перед скобками нужно поставить обратный слеш "\".

Действия

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

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.
    -delete

    Полезен, когда необходимо найти и удалить все пустые файлы, например:

    $ find . -empty -delete

    Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

    -exec:

    Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.

    -exec command <> \;
    • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
      • rm
      • mv
      • cp

      С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

      $ find . -empty -exec rm <> \;

      Другой пример использования действия -exec:

      $ find . -name "*.jpg" -exec cp <> /backups/fotos \;

      Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

      Заключение

      Команду find можно использовать для поиска:

      • Файлов по имени.
      • Дате последнего доступа.
      • Дате последнего изменения.
      • Имени пользователя (владельца файла).
      • Имени группы.
      • Размеру.
      • Разрешению.
      • Другим критериям.

      С полученными результатами можно сразу выполнять различные действия, такие как:

      • Удаление.
      • Копирование.
      • Перемещение в другой каталог.

      Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.

      image

      • терминал linux
      • команда find
      • системное администрирование linux
      • системное администрирование

      Поиск в Linux с помощью команды find

      Обновлено

      Обновлено: 29.05.2024 Опубликовано: 25.07.2016

      Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.

      Общий синтаксис

      путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.». набор правил, по которым выполнять поиск. * по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.

      Описание опций

      • f — файл;
      • d — каталог;
      • l — ссылка;
      • p — pipe;
      • s — сокет.

      Также доступны логические операторы:

      Оператор Описание
      -a Логическое И. Объединяем несколько критериев поиска.
      -o Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска.
      -not или ! Логическое НЕ. Инвертирует критерий поиска.

      Полный набор актуальных опций можно получить командой man find.

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

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

      1. Простой поиск по имени:

      find / -name "file.txt"

      * в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.

      2. Поиск файла по части имени:

      * данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp

      3. Несколько условий.

      а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:

      find . -name "sess_*" -a -name "*cd"

      б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:

      find . -name "sess_*" -o -name "*cd"

      в) Более компактный вид имеют регулярные выражения, например:

      find . -regex '.*/\(sess_.*cd\)'

      * где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).

      Будте аккуратнее при использовании условий, так как они отделяют одну часть опций, от другой. Например:

      find ./ -name 1 -o -name 2 -type f

      . будет искать либо все с именем 1, либо только файлы с именем 2 (опция -type f находится после -o справа). Если нужны файлы с именем 1 или 2, то используем скобки:

      find ./ \( -name 1 -o -name 2 \) -type f

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

      4. Найти все файлы, кроме .log:

      find . ! -name "*.log"

      * в данном примере мы воспользовались логическим оператором !.

      Поиск по дате

      1. Поиск файлов, которые менялись определенное количество дней назад:

      find . -type f -mtime +60

      * данная команда найдет файлы, которые менялись более 60 дней назад.

      Или в промужутке:

      find . -mmin -20 -mmin +10 -type f

      * найти все файлы, которые менялись более 10 минут, но не более 20-и.

      2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find --version).

      а) дате изменения:

      find . -type f -newermt "2019-11-02 00:00"

      * покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.

      find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02

      * найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).

      б) дате обращения:

      find . -type f -newerat 2019-10-08

      * все файлы, к которым обращались с 08.10.2019.

      find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01

      * все файлы, к которым обращались в октябре.

      в) дате создания:

      find . -type f -newerct 2019-09-07

      * все файлы, созданные с 07 сентября 2019 года.

      find . -type f -newerct 2019-09-07 ! -newerct "2019-09-09 07:50:00"

      * файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50

      Или можно найти все файлы, созданные за сегодняшний день:

      find ./ -newerct 'yesterday'

      По типу

      1. Искать в текущей директории и всех ее подпапках только файлы:

      * f — искать только файлы.

      2. Найти только директории:

      * d — искать только папки.

      3. Найти исполняемые (бинарные) файлы.

      У find нет опции для поиска бинарных файлов, но мы можем передать результат поиска команде grep -IL с помощью exec (подробнее рассмотрен ниже):

      find / -name openssl -type f -exec grep -IL . "<>" \;

      * в данном примере мы найдем в системе все файлы с именем openssl, которые являются исполняемыми.

      Поиск по правам доступа

      1. Ищем все справами на чтение и запись:

      find / -perm 0666

      2. Находим файлы, доступ к которым имеет только владелец:

      find / -perm 0600

      Поиск файла по содержимому

      find / -type f -exec grep -i -H "content" <> \;

      * в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.

      С сортировкой по дате модификации

      find /data -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

      * команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.

      Лимит на количество выводимых результатов

      Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:

      find /data -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n 1

      Поиск с действием (exec)

      1. Найти только файлы, которые начинаются на sess_ и удалить их:

      find . -name "sess_*" -type f -print -exec rm <> \;

      * -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.

      2. Переименовать найденные файлы:

      find . -name "sess_*" -type f -exec mv <> new_name \;

      find . -name "sess_*" -type f | xargs -I '<>' mv <> new_name

      3. Переместить найденные файлы:

      find . -name "sess_*" -type f -exec mv <> /new/path/ \;

      * в данном примере мы переместим все найденные файлы в каталог /new/path/.

      4. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:

      find . -name "*.tmp" | wc -l

      5. Изменить права.

      Рассмотрим пример, как найти все папки и задать им определенные права:

      find /home/user/* -type d -exec chmod 2700 <> \;

      * в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.

      Или так можно изменить права для всех файлов и каталогов:

      find ./ -type f -exec chmod 0644 <> \;

      * в данном примере мы ищем все файлы (type f) в текущей директории ./ и ставим для них права 0644.

      find ./ -type d -exec chmod 0755 <> \;

      * в данном примере мы ищем все папки (type d) в текущей директории ./ и ставим для них права 0755.

      6. Передать найденные файлы конвееру (pipe):

      find /etc -name '*.conf' -follow -type f -exec cat <> \; | grep 'test'

      * в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.

      7. Произвести замену в файлах с помощью команды sed:

      find /opt/project -type f -exec sed -i -e "s/test/production/g" <> \;

      * находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.

      8. Выполнить несколько команд можно с помощью нескольких вызовов exec:

      find ./ -type d -exec chmod 0755 <> \; -exec chown dmosk <> \;

      * в итоге, первая команда будет назначать права 0755, а вторая — задавать владельца dmosk.

      Чистка по расписанию

      Команду find удобно использовать для автоматического удаления устаревших файлов.

      Открываем на редактирование задания cron:

      0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;

      * в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
      * полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.

      15 супер полезных примеров команды find в 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 – время последнего изменения файла
      • 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. Их содержимое может иметь следующий вид: . Символ + используется как конец команды 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 .

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *