В предыдущей статье мы рассмотрели базовые возможности команды find: поиск по имени, правам и владельцам (группам). Эти приёмы помогают легко ориентироваться в системе и находить нужные файлы под разными углами. В этой статье, мы перейдём к более тонким сценариям использования find, чтобы вы могли ещё глубже контролировать содержимое своей файловой системы.
Мы разберём, как искать файлы на основе даты и времени (создания, последнего доступа или изменения), узнаем о фильтрации по размеру и научимся эффективно удалять найденные объекты. Эти навыки критически важны при администрировании систем, где необходимо своевременно чистить логи, отслеживать устаревшие или громоздкие файлы и поддерживать порядок в структуре каталогов.
Удаление файлов и директорий напрямую с помощью find
Иногда нужно найти определённые файлы и сразу их удалить (например, временные или ненужные).
Удаление одного конкретного файла
Предположим, что нужно удалить файл zomro.txt:
find . -type f -name "zomro.txt" -exec rm -f {} \;
- -exec rm -f {} \; – команда удаления для каждого найденного файла.
Удаление нескольких типов файлов
Если нужно удалить все файлы с расширением .txt или .mp3:
find . -type f -name "*.txt" -exec rm -f {} \;
Или отдельно:
find . -type f -name "*.mp3" -exec rm -f {} \;
Поиск и удаление пустых файлов
Иногда бывает полезно избавиться от пустых (размер 0) файлов в директории:
find /tmp -type f -empty
Если нужно сразу удалить, то:
find /tmp -type f -empty -exec rm -f {} \;
Поиск и удаление пустых директорий
Чтобы найти все пустые директории в /tmp:
find /tmp -type d -empty
Если хотите их сразу удалить:
find /tmp -type d -empty -exec rmdir {} \;
Поиск скрытых файлов
Скрытые файлы в Linux — это файлы, начинающиеся с точки (.). Чтобы найти такие файлы:
find /tmp -type f -name ".*"
Можно комбинировать с -exec, например, для удаления или копирования скрытых файлов.
Поиск по владельцам и группам (Часть III)
В крупных системах или при администрировании серверов важно уметь быстро находить файлы, принадлежащие определённым пользователям или группам.
Поиск конкретного файла определённого владельца
Допустим, нам нужно найти файл zomro.txt во всём корневом (/) каталоге, который принадлежит пользователю root:
find / -user root -name zomro.txt
- -user root – условие на владельца файла (root).
Поиск всех файлов пользователя
Чтобы увидеть все файлы, владельцем которых является, например, zomro:
find /home -user zomro
Это может пригодиться для проверки домашнего каталога пользователя или во время миграции.
Поиск всех файлов, принадлежащих определённой группе
Для поиска всех файлов группы developer в /home:
find /home -group developer
Поиск файлов определённого типа по владельцу
Для поиска всех .txt файлов пользователя zomro (причём игнорируя регистр):
find /home -user zomro -iname "*.txt"
Поиск по дате и времени (Часть IV)
Не менее часто требуется искать файлы, основанные на времени последнего изменения, доступа или изменения статуса (ctime). Ниже примеры для разных сценариев.
Поиск файлов, изменённых 50 дней назад
Опция -mtime учитывает дату последней модификации (modify time) файла:
find / -mtime 50
Эта команда выведет файлы, которые ровно 50 дней назад были изменены.
Поиск файлов, к которым обращались 50 дней назад
Опция -atime учитывает дату последнего доступа (access time):
find / -atime 50
Найдутся файлы, к которым последний раз обратились 50 дней назад.
Поиск файлов, изменённых более 50 и менее 100 дней назад
Если хотим найти файлы, модифицированные более 50 дней назад, но меньше 100 дней:
find / -mtime +50 -mtime -100
- +50 означает «старше, чем 50 дней».
- -100 означает «моложе, чем 100 дней».
Поиск файлов, изменённых за последний час
Если нужно отыскать файлы, которые поменялись за последние 60 минут, используем -cmin (ctime в минутах):
find / -cmin -60
- -60 означает, что прошло меньше 60 минут с последнего изменения статуса файла.
Поиск файлов, модифицированных за последний час
Аналогично, но с ключом -mmin (modify time, в минутах):
find / -mmin -60
Найдёт файлы, модифицированные менее часа назад.
Поиск файлов, к которым обращались за последний час
Для поиска по времени последнего доступа (-amin):
find / -amin -60
Выведет все файлы, к которым обращались в последние 60 минут.
Поиск по размеру (Часть V)
Очень полезно быстро находить файлы, занимающие слишком много места, или наоборот, очень маленькие.
Поиск файлов размером 50МБ
Чтобы найти все файлы размером ровно 50MB:
find / -size 50M
Обратите внимание на суффиксы:
- M – мегабайты
- k – килобайты
- G – гигабайты
Поиск файлов в диапазоне 50МБ – 100МБ
Чтобы найти файлы, размер которых больше 50МБ, но меньше 100МБ:
find / -size +50M -size -100M
- +50M означает «больше, чем 50MB».
- -100M означает «меньше, чем 100MB».
Поиск и удаление файлов больше 100МБ
Для поиска и немедленного удаления всех файлов более 100МБ:
find / -type f -size +100M -exec rm -f {} \;
Будьте предельно осторожны с такой командой: она безвозвратно удалит все подходящие файлы.
Поиск и удаление файлов .mp3 больше 10МБ
Иногда нужно почистить большие медиафайлы. Например, найти все .mp3 свыше 10МБ и сразу удалить:
find / -type f -name "*.mp3" -size +10M -exec rm {} \;
- -name "*.mp3" – ищем только файлы с расширением .mp3.
Дополнительные советы и рекомендации
Используйте кавычки при поиске с пробелами
Если имена файлов или путей содержат пробелы или специальные символы, указывайте их в кавычках, например find /path -name "My File.txt".
Комбинируйте несколько условий
find позволяет объединять условия с помощью логических операторов -and, -or, -not. Например, чтобы найти файлы, которые принадлежат пользователю root или группе developer, можно воспользоваться:
find / -user root -or -group developer
Используйте xargs для ускорения
Вместо -exec иногда лучше использовать конструкцию | xargs. Это может быть быстрее, потому что -exec запускает команду для каждого найденного файла, а xargs может пакетировать их вместе. Пример:
find /tmp -type f -name "*.log" | xargs rm -f
Однако с файлами, содержащими пробелы, нужно быть осторожнее — потребуется флаг -print0 и использование xargs -0.
Проверяйте перед удалением
Если удаляете файлы, сначала проверьте результат поиска без -exec. Только когда убедились, что список найденных файлов корректен, добавляйте -exec rm.
Учтите контекст
В некоторых системах или файлах может иметься смысл искать не только по владельцу или размеру, но и по более сложным критериям (например, регулярные выражения, атрибуты SELinux и т.д.). Команда find поддерживает множество ключей — изучайте man find, чтобы освоить их все.
Глубина поиска
Если нужно ограничить глубину поиска, используйте ключ -maxdepth. Например, -maxdepth 1 укажет find искать только в текущем каталоге (не спускаясь в подпапки).
Поиск с учётом типов файловой системы
Если нужно исключить определённые файловые системы (например, сетевые nfs), используйте опцию -xdev, чтобы find не «переходил» на другие устройства.
Заключение
Команда find — универсальный и мощный инструмент, который обязательно должен быть в арсенале каждого системного администратора, разработчика и продвинутого пользователя. С её помощью можно быстро решить множество практических задач: от банальной очистки временных файлов до тонкой фильтрации по правам, владельцам, дате и размерам.
Перечисленные выше 35+ примеров — лишь вершина айсберга. В действительности find имеет куда более широкие возможности. Изучайте справочные страницы (man find), экспериментируйте и комбинируйте флаги — и вы увидите, насколько гибкой и незаменимой может стать эта утилита в повседневной работе.