
Поиск файлов — относительно простая задача, когда вы используете графический интерфейс. Но он не всегда доступен. Например, если речь идет о сервере, вам придется буквально все делать при помощи командной строки.
Для поиска файлов и папок в Linux есть мощная команда — find. В этой статье мы разберем несколько примеров ее использования.
Что собой представляет команда find в Linux?
Команда find позволяет эффективно искать файлы, папки, символьные и блочные устройства.
Вот базовый синтаксис команды find:
find /path/ -type f -name file-to-search
Распишем подробно:
/path— это путь к месту, где нужно искать файл. Это стартовая позиция для поиска файлов. В качестве пути может выступать/или., что означает корневую и текущую директорию соответственно.-typeпредставляет файловые дескрипторы. Они могут быть следующими:f– обычный файл, например, текстовый, файл изображения, скрытый файл.d– директория. Для тех случаев, когда нужно найти папки.l– символическая ссылка. Такие ссылки указывают на файлы.c– символьные устройства. Файлы, используемые для доступа к символьным устройствам, называются файлами символьных устройств. Драйверы коммуницируют с символьными устройствами, отсылая и получая отдельные символы (байты, октеты). Примеры таких устройств — клавиатуры, звуковые карты и мыши.b– блочные устройства. Файлы, используемые для доступа к блочным устройствам, называются файлами блочных устройств. Драйверы коммуницируют с блочными устройствами, отсылая и получая целые блоки данных. Примеры таких устройств — USB, CD-ROM.
-name— имя (часть имени) файла, который вы хотите найти.
Команда find: практические примеры
Теперь, познакомившись с синтаксисом find, давайте рассмотрим примеры использования этой команды.
Как искать файлы по имени или по расширению
Предположим, нам нужно найти файлы, в названии которых содержится слово «style». Для этого мы используем следующую команду:
find . -type f -name style*
Результат:

А если мы хотим найти файлы с определенным расширением, например, .html, команду нужно слегка видоизменить:
find . -type f -name *.html
Результат:

Как искать скрытые файлы
Имена скрытых файлов начинаются с точки. Обычно они скрыты, но их можно увидеть в общем списке файлов в директории, если к команде ls добавить флаг -a.
Чтобы найти скрытые файлы при помощи find, команду нужно написать следующим образом:
find . -type f -name ".*"
Результат:

Как искать логи и конфиги
Лог-файлы имеют расширение .log. Найти их можно так:
find . -type f -name "*.log"
Результат:

Аналогично можно искать конфигурационные файлы:
find . -type f -name "*.conf"
Как искать файлы по типу
Чтобы найти символьные файлы, нужно указать дескриптор c для -type:
find / -type c
Аналогично, для блочных файлов нужно указать дескриптор b:
find / -type b
Как искать директории
Команда, приведенная ниже, позволит нам найти папки, имена которых начинаются с lib. Обратите внимание, что мы используем -type d.
find . -type d -name "lib*"
Результат:

Примечание. Чтобы увидеть, какие подпапки есть в заданной папке, нужно выполнить команду ls -l. То, что файл является директорией, будет видно по букве d:

Как искать файлы по размеру
Поиск файлов по размеру — одна из самых полезных функций команды find.
find / -size +250MB
Здесь мы выводим файлы, размер которых превышает 250MB.
Можно использовать и другие единицы:
- G: гигабайты
- M: мегабайты
- K: килобайты
- b: байты
Просто заменяйте <Unit Type> соответствующими единицами измерения.
find <directory> -type f -size +N<Unit Type>
Как искать файлы по времени изменения
find /path -name "*.txt" -mtime -10
-mtime +10означает, что мы ищем файл, измененный больше 10 дней назад-mtime -10означает, что искомый файл был изменен меньше, чем 10 дней назад-mtime 10без + или — означает, что файл был изменен ровно 10 дней назад.
Вот содержимое моей домашней директории:

Примечание редакции Techrocks. Для вывода содержимого домашней директории использована команда ls -ltra. Эти флаги означают вывод полной информации (-l) с упорядочиванием по времени модификации (-t) в обратном порядке (-r), со включением скрытых файлов (-a). Оригинальная статья опубликована 17 марта.
Попробуем произвести в этой директории поиск по времени изменения.
find . -type f -name ".*" -mtime +10

Выведены файлы, измененные больше 10 дней назад.
Команда find в bash-скриптах
Мы можем использовать find вместе с командами rm или mv и таким образом создавать полезные bash-скрипты для автоматизации действий с файлами.
Скажем, мы хотим написать скрипт, перемещающий логи, которым больше 7 дней, в бэкап. А в бэкапе хотим удалять файлы логов, которым больше 30 дней.
Мы можем написать такой скрипт и сделать его выполняемым по графику при помощи cron. О cron можно подробнее почитать в статье «Задачи cron и автоматизация в Linux».
Вот наш скрипт:
#!/bin/bash
# Скрипт для перемещения логов старше 7 дней в бэкап по адресу /app/backup_logs/ESB0*
# Переместить ESB01 логи в бэкап
find /logs/esb01/audit -name "*.tar.gz" -mtime +7 -exec mv {} app/backup_logs/ESB01/ \;
# Удалить из бэкапа логи старше 30 дней
find /app/backup_logs/ESB01 -name "*.tar.gz" -mtime +30 -exec rm {} \;
Обратите внимание, что здесь мы используем exec. В общем, exec выполняет переданную ему команду (в нашем случае mv и rm). {} — плейсхолдер для результатов этой команды. Наконец, мы указываем разделитель ;. Поскольку мы не хотим, чтобы оболочка интерпретировала точку с запятой, мы экранируем ее при помощи обратной косой черты \.
Этот скрипт очень полезен для архивации и удаления логов.
Итоги
В этой статье мы познакомились с командой find. Мы научились искать файлы по имени, типу, размеру и дате изменения при помощи командной строки.
Перевод статьи «How to Search for Files from the Linux Command Line».


