Как использовать команду find в Linux?

Команда find - невероятно мощный инструмент, и его изучение может здорово вас выручить. Данные знания помогут вам эффективно выполнять различные задачи системного администрирования, такие как управление дисковым пространством, рекурсивные файловые операции и резервное копирование.

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

$ find directory-to-search criteria action

где:

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

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

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

Поиск по названию (-name)

Вот простой пример. Следующая команда ищет файл a.txt в текущем каталоге:

$ find . -name "a.txt"
./a.txt

где:

  • . (точка) - означает что файл относится к текущему каталогу
  • -name -  указывает критерии, которые должны быть сопоставлены. В данном случае название файла

В данном примере критерий -name учитывает регистр и игнорирует файл A.txt. Чтобы гарантировать, что ваш поиск нечувствителен к регистру, используйте -iname :

$ find . -iname "a.txt"
./a.txt
./A.txt

Чтобы найти все .jpg файлы изображений в текущем каталоге, используйте шаблон подстановки *.jpg:

$ find . -name "*.jpg"
./genxfacebook2.jpg
./genxfacebook1.jpg
./Moodle2.jpg
./moodle.jpg
./moodle/moodle1.jpg
./genxfacebook.jpg

Вы можете использовать имя каталога для поиска. Например, чтобы найти все изображения в формате .jpg в каталоге /home:

$ find /home -name "*.jpg"
find: `/home/ubuntu/.ssh': Permission denied
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/me/hello.jpg
find: `/home/me/testfiles': Permission denied
find: `/home/me/data': Permission denied
/home/me/water.jpg
find: `/home/me/.cache': Permission denied

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

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

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

С помощью критерия -type вы можете искать файлы по типу. Типы файлов могут быть:

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

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

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

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

Возможно, вам потребуется найти большие файлы и удалить их. В следующем примере за критерием размера файла следует строка +1G. Это приведет к поиску всех файлов размером более 1 ГБ.

$ find . -size +1G
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg

Знак + означает поиск файлов, размер которых превышает указанное ниже число. Знак минус (-) может использоваться для обозначения меньшего чем. Отсутствие знака означает точное совпадение размера.

СимволЕдиница измерения
сБайт
kКилобайт
MМегабайт
GГигабайт

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

Используйте критерий -empty  чтобы найти пустые каталоги и файлы:

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

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

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

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

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

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

Вы можете искать файлы по времени последнего доступа с помощью опции -atime. Например, следующая команда ищет файлы, к которым не обращались в течение последних 180 дней:

$ find . -atime +180

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

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

С помощью опции -user username вы можете искать все файлы и каталоги, принадлежащие пользователю. Например, следующая команда ищет все файлы и каталоги, принадлежащие пользователю ubuntu, в каталоге /home:

$ find /home -user ubuntu 2>/dev/null
/home/ubuntu
/home/ubuntu/.bash_logout
/home/ubuntu/.bashrc
/home/ubuntu/.ssh
/home/ubuntu/.profile

Поиск по режиму

Хотите искать файлы, настроенные для определенного режима, то есть иметь определенный набор разрешений? Используют критерий -perm. В следующем примере выполняется поиск файлов с разрешениями 777:

$ find /home -perm 777

Операторы

Для объединения нескольких тестов в одну команду поиска можно использовать следующие три логических оператора:

  • -and
  • -or
  • -not

Например, следующая команда ищет файлы размером более 100 МБ, принадлежащие пользователю me:

$ find /home  -user me  -and  -size +100M  2>/dev/null
/home/me/kali-linux-2020.3-installer-netinst-i386.iso

Следующая команда ищет файлы размером более 100 МБ, принадлежащие пользователю me или пользователю vagrant:

$ find /home \( -user vagrant -or -user me \)  -and  -size +100M  2>/dev/null
/home/vagrant/LibreOffice_7.0.1_Linux_x86-64_deb.tar.gz
/home/me/kali-linux-2020.3-installer-netinst-i386.iso

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

Действия

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

ДействиеОписание
-deleteУдаляет файлы, соответствующие критериям поиска
-lsПоказывает подробный вывод ls с размерами файлов и количеством inode
-printПоказывает полный путь к соответствующим файлам. Это действие по умолчанию, если не указано другое действие.
-execВыполняет следующую команду в каждой строке результатов поиска.

Итак, если вы хотите найти все пустые файлы и удалить их, вы можете сделать это следующим образом:

$ find . -empty -delete

Внимание: перед использованием действия удаления всегда можно безопасно запустить команду один раз с действием  -print и подтвердить результаты.

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

-exec command {} \;

где:

  • command - это команда, которую вы хотите выполнить для результатов поиска, например rm, mv или cp.
  • {} представляет результаты поиска.
  • Команда заканчивается точкой с запятой после обратной косой черты.

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

$ find . -empty -exec rm {} \;

Вот еще один пример использования действия -exec. Следующая команда копирует все .png изображения в каталог backup/images:

$ find . -name "*.png" -exec cp {} /backups/images \;

Заключение

Вы можете использовать команду find для поиска файлов по имени, дате последнего доступа, дате последнего изменения, имени пользователя (владельца), имени группы, размеру, разрешениям и другим критериям. С помощью этих результатов поиска вы можете выполнять над ними действия, такие как удаление, копирование или перемещение в другое место.

Также рекомендуем прочитать:

  1. 8 команд Linux при использовании которых, нужно соблюдать осторожность
  2. 5 лучших дистрибутивов Linux для ноутбуков-8
  3. Самые легкие дистрибутивы Linux. Топ-10 для старых компьютеров
  4. 10 наиболее часто задаваемых вопросов о Linux