Поиск файлов — относительно простая задача, когда вы используете графический интерфейс. Но он не всегда доступен. Например, если речь идет о сервере, вам придется буквально все делать при помощи командной строки.
Для поиска файлов и папок в 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».