Как использовать команду 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 |
Показывает полный путь к соответствующим файлам. Это действие по умолчанию, если не указано другое действие. | |
-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 для поиска файлов по имени, дате последнего доступа, дате последнего изменения, имени пользователя (владельца), имени группы, размеру, разрешениям и другим критериям. С помощью этих результатов поиска вы можете выполнять над ними действия, такие как удаление, копирование или перемещение в другое место.
Также рекомендуем прочитать: