Команда find — это мощный инструмент для рекурсивного поиска файлов и каталогов в Linux. Она позволяет искать объекты, соответствующие заданным критериям, и выполнять действия с найденными файлами. В этой статье мы подробно разберем, как использовать команду find для эффективного поиска в файловой системе, включая поиск по расширению, типу файлов, размеру, времени изменения, доступа, пути и другим параметрам.
- Основы команды find
- Ключи команды find
- Поиск по расширению файлов
- Поиск по типу файлов
- Поиск по размеру файлов
- Поиск по времени изменения, доступа и статуса
- Фильтрация пути
- Поиск по содержимому файлов
- Исключение недоступных каталогов
- Оптимизация поиска
- Примеры использования
- Выполнение команд для найденных файлов
- Заключение
Основы команды find
Команда find используется для рекурсивного поиска файлов и каталогов в указанной директории. Её базовый синтаксис выглядит следующим образом:
find [путь] [критерии_поиска] [действие]
путь
: Директория, в которой будет выполняться поиск (например,/home
или.
для текущего каталога).критерии_поиска
: Параметры, по которым осуществляется поиск (например, имя файла, размер, тип).действие
: Операция, которая будет выполнена с найденными файлами (например, удаление, перемещение).
Ключи команды find
Команда find поддерживает множество ключей для уточнения поиска. Вот основные из них:
-name
: Поиск по имени файла.-iname
: Поиск по имени файла без учета регистра.-size
: Поиск по размеру файла.-type
: Поиск по типу файла.-mtime
: Поиск по дате изменения.-atime
: Поиск по дате последнего доступа.-ctime
: Поиск по дате изменения статуса.-path
: Поиск по пути.-exec
: Выполнение команды для найденных файлов.
Поиск по расширению файлов
Команда find позволяет искать файлы по их расширению. Это особенно полезно, если вам нужно найти все файлы с определенным расширением, например, .txt
, .jpg
или .log
.
Поиск файлов с определенным расширением
Чтобы найти все файлы с расширением .txt
в текущем каталоге, используйте:
find . -maxdepth 1 -type f -name "*.txt"
.
: Текущий каталог.-maxdepth 1
: Ограничивает поиск только текущим каталогом (без рекурсии).-type f
: Ищет только файлы.-name "*.txt"
: Ищет файлы с расширением.txt
.
Поиск файлов с определенным расширением в указанном каталоге
Чтобы найти все файлы с расширением .log
в каталоге /var/log
, используйте:
find /var/log -maxdepth 1 -type f -name "*.log"
Поиск по типу файлов
Команда find позволяет искать файлы по их типу. Это особенно полезно, если вам нужно найти только определенные типы объектов, такие как обычные файлы, каталоги, символические ссылки или блочные устройства.
Основные типы файлов:
f
: Обычные файлы.d
: Каталоги.l
: Символические ссылки.b
: Блочные устройства.c
: Символьные устройства.p
: Именованные каналы (FIFO).s
: Сокеты.
Примеры:
Поиск обычных файлов
find . -type f
Поиск каталогов
find . -type d
Поиск блочных устройств
find /dev -type b
Поиск символических ссылок
find . -type l
Поиск по размеру файлов
Команда find позволяет искать файлы по их размеру. Размер можно указывать в различных единицах измерения: байтах, килобайтах, мегабайтах и гигабайтах.
Общий формат для поиска по размеру
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 МБ
find -type f -size +15M
Поиск файлов размером менее 12 КБ
find -type f -size -12k
Поиск файлов размером ровно 12 КБ
find -type f -size 12k
Или в байтах:
find -type f -size 12288c
Или в блоках (512 байт):
find -type f -size 24b
Или в блоках по умолчанию:
find -type f -size 24
Поиск по времени изменения, доступа и статуса
В файловой системе ext каждый файл имеет три временные метки:
- Время изменения (mtime): Когда содержимое файла было изменено.
- Время доступа (atime): Когда файл был последний раз прочитан.
- Время изменения статуса (ctime): Когда метаданные файла (например, права доступа) были изменены.
Поиск по времени изменения (mtime)
Чтобы найти файлы, измененные в течение последних 2 часов:
find . -mmin -120
Чтобы найти файлы, которые не изменялись в течение последних 2 часов:
find . -mmin +120
Поиск по времени доступа (atime)
Чтобы найти файлы, к которым обращались в течение последних 2 часов:
find . -amin -120
Поиск по времени изменения статуса (ctime)
Чтобы найти файлы, статус которых изменялся более 2 часов назад:
find . -cmin +120
Общий формат для времени
-mmin n
: Файл был измененn
минут назад.-mmin -n
: Файл был изменен менееn
минут назад.-mmin +n
: Файл был изменен болееn
минут назад
Поиск по дням
Чтобы найти файлы, измененные в течение последних 2 дней:
find . -mtime -2
Чтобы найти файлы, которые не изменялись в течение последних 2 дней:
find . -mtime +2
Поиск в диапазоне дат
Чтобы найти файлы, измененные в диапазоне дат с 2024-06-07 по 2024-06-08:
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
Поиск по временным меткам
Чтобы найти файлы, к которым был получен доступ в диапазоне от 1 часа назад до 10 минут назад:
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
: Сравнивает временную метку текущего файла сreference
.XY
может быть:at
: Время доступа.mt
: Время изменения.ct
: Время изменения статуса.
reference
: Имя файла или строка, описывающая абсолютное время.
Фильтрация пути
Параметр -path
позволяет указать шаблон для соответствия пути результата. Шаблон может также соответствовать самому имени файла или каталога.
Примеры
Поиск файлов, содержащих log
в любом месте их пути (папка или имя)
find . -type f -path '*log*'
Поиск файлов в папке с именем log
(на любом уровне)
find . -type f -path '*/log/*'
Поиск файлов в папке с именем log
или data
find . -type f -path '*/log/*' -o -path '*/data/*'
Поиск всех файлов, кроме тех, которые содержатся в папке с именем bin
find . -type f -not -path '*/bin/*'
Поиск всех файлов, кроме тех, которые содержатся в папке с именем bin
или файлах журнала
find . -type f -not -path '*log' -not -path '*/bin/*'
Поиск по содержимому файлов
Команда find
может быть использована для поиска текста внутри файлов. Для этого объедините её с командой grep
:
find . -type f -name "*" -print | xargs grep "искомый текст"
Эта команда ищет текст "искомый текст"
во всех файлах текущего каталога.
Исключение недоступных каталогов
При поиске в системе могут возникать ошибки Permission Denied
. Чтобы исключить недоступные каталоги, используйте:
find / -name filename -print 2>&1 | grep -v "Permission denied"
Или перенаправьте ошибки в /dev/null
:
find / -name filename -print 2> /dev/null
Оптимизация поиска
Для ускорения поиска в больших файловых системах можно использовать следующие рекомендации:
- Ограничьте глубину поиска: Используйте ключ
-maxdepth
, чтобы ограничить поиск определенным уровнем вложенности.
find / -maxdepth 3 -name "*.log"
- Используйте индексацию: Если возможно, используйте команду locate, которая работает быстрее благодаря предварительной индексации файлов.
- Избегайте поиска в системных каталогах: Исключите каталоги, такие как
/proc
,/sys
,/dev
, чтобы сократить время поиска.
Примеры использования
Поиск файлов/каталогов по имени
find . -name "myFile.txt"
Поиск файлов/каталогов по расширению
find . -name "*.txt"
Поиск по нескольким расширениям
find . -name "*.txt" -o -name "*.sh"
Поиск только файлов
find /opt -type f
Поиск только каталогов
find /opt -type d
Выполнение команд для найденных файлов
Использование xargs
find . -type d -print | xargs -r chmod 770
Использование -exec
find . -type d -exec chmod 770 {} \;
Использование цикла while
find . -type d | while read -r d; do chmod 770 "$d"; done
Заключение
Команда find — это незаменимый инструмент для рекурсивного поиска файлов и каталогов в Linux. Она позволяет гибко настраивать параметры поиска и выполнять действия с найденными объектами. Освоив команду find, вы сможете значительно упростить работу с файловой системой.
💬 А вы часто используете команду find? Поделитесь своими примерами в комментариях!
Дополнительные советы:
- Используйте
man find
для получения полной документации по команде. - Экспериментируйте с комбинациями ключей, чтобы находить файлы максимально эффективно.
Дополнительный материал:
- Как копировать большое количество файлов в Linux
- Как исключить папку при поиске файлов в Linux: подробное руководство
Was this helpful?
0 / 0