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

Команда find — это мощный инструмент для рекурсивного поиска файлов и каталогов в Linux. Она позволяет искать объекты, соответствующие заданным критериям, и выполнять действия с найденными файлами. В этой статье мы подробно разберем, как использовать команду find для эффективного поиска в файловой системе, включая поиск по расширению, типу файлов, размеру, времени изменения, доступа, пути и другим параметрам.

Основы команды find

Команда find используется для рекурсивного поиска файлов и каталогов в указанной директории. Её базовый синтаксис выглядит следующим образом:

Bash
find [путь] [критерии_поиска] [действие]
  • путь: Директория, в которой будет выполняться поиск (например, /home или . для текущего каталога).
  • критерии_поиска: Параметры, по которым осуществляется поиск (например, имя файла, размер, тип).
  • действие: Операция, которая будет выполнена с найденными файлами (например, удаление, перемещение).

Ключи команды find

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

  • -name: Поиск по имени файла.
  • -iname: Поиск по имени файла без учета регистра.
  • -size: Поиск по размеру файла.
  • -type: Поиск по типу файла.
  • -mtime: Поиск по дате изменения.
  • -atime: Поиск по дате последнего доступа.
  • -ctime: Поиск по дате изменения статуса.
  • -path: Поиск по пути.
  • -exec: Выполнение команды для найденных файлов.

Поиск по расширению файлов

Команда find позволяет искать файлы по их расширению. Это особенно полезно, если вам нужно найти все файлы с определенным расширением, например, .txt, .jpg или .log.

Поиск файлов с определенным расширением

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

Bash
find . -maxdepth 1 -type f -name "*.txt"
  • .: Текущий каталог.
  • -maxdepth 1: Ограничивает поиск только текущим каталогом (без рекурсии).
  • -type f: Ищет только файлы.
  • -name "*.txt": Ищет файлы с расширением .txt.

Поиск файлов с определенным расширением в указанном каталоге

Чтобы найти все файлы с расширением .log в каталоге /var/log, используйте:

Bash
find /var/log -maxdepth 1 -type f -name "*.log"

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

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

Основные типы файлов:

  • f: Обычные файлы.
  • d: Каталоги.
  • l: Символические ссылки.
  • b: Блочные устройства.
  • c: Символьные устройства.
  • p: Именованные каналы (FIFO).
  • s: Сокеты.

Примеры:

Поиск обычных файлов

Bash
find . -type f

Поиск каталогов

Bash
find . -type d

Поиск блочных устройств

Bash
find /dev -type b

Поиск символических ссылок

Bash
find . -type l

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

Команда find позволяет искать файлы по их размеру. Размер можно указывать в различных единицах измерения: байтах, килобайтах, мегабайтах и гигабайтах.

Общий формат для поиска по размеру

Bash
find [путь] -type f -size n[cwbkMG]
  • n: Числовое значение размера.
  • +n: Файлы размером больше n.
  • -n: Файлы размером меньше n.
  • n (без знака): Файлы размером ровно n.

Единицы измерения

  • c: Байты.
  • w: 2 байта.
  • b: 512 байт (по умолчанию).
  • k: Килобайты (1024 байта).
  • M: Мегабайты (1024 килобайта).
  • G: Гигабайты (1024 мегабайта).

Примеры

Поиск файлов размером более 15 МБ

Bash
find -type f -size +15M

Поиск файлов размером менее 12 КБ

Bash
find -type f -size -12k

Поиск файлов размером ровно 12 КБ

Bash
find -type f -size 12k

Или в байтах:

Bash
find -type f -size 12288c

Или в блоках (512 байт):

Bash
find -type f -size 24b

Или в блоках по умолчанию:

Bash
find -type f -size 24

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

В файловой системе ext каждый файл имеет три временные метки:

  • Время изменения (mtime): Когда содержимое файла было изменено.
  • Время доступа (atime): Когда файл был последний раз прочитан.
  • Время изменения статуса (ctime): Когда метаданные файла (например, права доступа) были изменены.

Поиск по времени изменения (mtime)

Чтобы найти файлы, измененные в течение последних 2 часов:

Bash
find . -mmin -120

Чтобы найти файлы, которые не изменялись в течение последних 2 часов:

Bash
find . -mmin +120

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

Чтобы найти файлы, к которым обращались в течение последних 2 часов:

Bash
find . -amin -120

Поиск по времени изменения статуса (ctime)

Чтобы найти файлы, статус которых изменялся более 2 часов назад:

Bash
find . -cmin +120

Общий формат для времени

  • -mmin n: Файл был изменен n минут назад.
  • -mmin -n: Файл был изменен менее n минут назад.
  • -mmin +n: Файл был изменен более n минут назад

Поиск по дням

Чтобы найти файлы, измененные в течение последних 2 дней:

Bash
find . -mtime -2

Чтобы найти файлы, которые не изменялись в течение последних 2 дней:

Bash
find . -mtime +2

Поиск в диапазоне дат

Чтобы найти файлы, измененные в диапазоне дат с 2024-06-07 по 2024-06-08:

Bash
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

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

Чтобы найти файлы, к которым был получен доступ в диапазоне от 1 часа назад до 10 минут назад:

Bash
touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print

Общий формат для -newerXY

  • newerXY reference: Сравнивает временную метку текущего файла с referenceXY может быть:
    • at: Время доступа.
    • mt: Время изменения.
    • ct: Время изменения статуса.
  • reference: Имя файла или строка, описывающая абсолютное время.

Фильтрация пути

Параметр -path позволяет указать шаблон для соответствия пути результата. Шаблон может также соответствовать самому имени файла или каталога.

Примеры

Поиск файлов, содержащих log в любом месте их пути (папка или имя)

Bash
find . -type f -path '*log*'

Поиск файлов в папке с именем log (на любом уровне)

Bash
find . -type f -path '*/log/*'

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

Bash
find . -type f -path '*/log/*' -o -path '*/data/*'

Поиск всех файлов, кроме тех, которые содержатся в папке с именем bin

Bash
find . -type f -not -path '*/bin/*'

Поиск всех файлов, кроме тех, которые содержатся в папке с именем bin или файлах журнала

Bash
find . -type f -not -path '*log' -not -path '*/bin/*'

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

Команда find может быть использована для поиска текста внутри файлов. Для этого объедините её с командой grep:

Bash
find . -type f -name "*" -print | xargs grep "искомый текст"

Эта команда ищет текст "искомый текст" во всех файлах текущего каталога.


Исключение недоступных каталогов

При поиске в системе могут возникать ошибки Permission Denied. Чтобы исключить недоступные каталоги, используйте:

Bash
find / -name filename -print 2>&1 | grep -v "Permission denied"

Или перенаправьте ошибки в /dev/null:

Bash
find / -name filename -print 2> /dev/null

Оптимизация поиска

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

  • Ограничьте глубину поиска: Используйте ключ -maxdepth, чтобы ограничить поиск определенным уровнем вложенности.
Bash
  find / -maxdepth 3 -name "*.log"
  • Используйте индексацию: Если возможно, используйте команду locate, которая работает быстрее благодаря предварительной индексации файлов.
  • Избегайте поиска в системных каталогах: Исключите каталоги, такие как /proc, /sys, /dev, чтобы сократить время поиска.

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

Поиск файлов/каталогов по имени

Bash
find . -name "myFile.txt"

Поиск файлов/каталогов по расширению

Bash
find . -name "*.txt"

Поиск по нескольким расширениям

Bash
find . -name "*.txt" -o -name "*.sh"

Поиск только файлов

Bash
find /opt -type f

Поиск только каталогов

Bash
find /opt -type d

Выполнение команд для найденных файлов

Использование xargs

Bash
find . -type d -print | xargs -r chmod 770

Использование -exec

Bash
find . -type d -exec chmod 770 {} \;

Использование цикла while

Bash
find . -type d | while read -r d; do chmod 770 "$d"; done

Заключение

Команда find — это незаменимый инструмент для рекурсивного поиска файлов и каталогов в Linux. Она позволяет гибко настраивать параметры поиска и выполнять действия с найденными объектами. Освоив команду find, вы сможете значительно упростить работу с файловой системой.

💬 А вы часто используете команду find? Поделитесь своими примерами в комментариях!

Дополнительные советы:

  • Используйте man find для получения полной документации по команде.
  • Экспериментируйте с комбинациями ключей, чтобы находить файлы максимально эффективно.

Дополнительный материал:

Was this helpful?

0 / 0

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