Поиск файлов find
find [from_dir] [tests operators actions]
Команда find
рекурсивно проверяет файлы и каталоги начиная с каталога from_dir на соответствие условиям tests, если какое-то условие не выполнено, то дальнейшие не проверяются и начинается проверка следующего файла/каталога. Условия могут объединяться логическими операторами, а при выполнении условий могут выполняться действия - actions.
Некоторые условия:
- -name 'pattern' - поиск имени по шаблону в стиле _sh. В отличии от sh по '*' ищутся файлы, начинающиеся с точки, а '/' не срабатывает, поскольку проверяются имена внутри одного каталога
- -regex pattern - поиск имени по регулярному выражению. Проверяется полное имя от стартового каталога.
- -type [f|d|l..] - поиск файлов, каталогов, символических ссылок и т.п.
- -mtime [+|-]n - поиск файлов по времени модификации в днях . '+' - старше чем n дней, '-' - младше чем n дней, без знака - в точности n дней назад
- -mmin [+|-]n - то же, что и -mtime, но время в минутах
- -size [+|-]n[kMG] - поиск файлов размером больше/меньше/равно n кило/Мега/Гига байт
- -user name - поиск файлов пользователя
Действия:
- -quit - немедленное завершение поиска
- -delete
- -print - печать имени начиная со стартового каталога. Рекомендуется добавлять в конец поиска если нужно просмотреть список найденных файлов
- -print0 - то же, что и -print, но в качестве разделителя имён используется символ '\0'. Рекомендуется использовать при обработке найденных командой
xargs
- -printf format - печать информации о файле по формату. Разделитель имён надо вставлять в формат. %f - базовое имя без каталога, %p - полное имя с каталогом, %h - имя каталога, %s - размер.
- -exec cmd args... {} \;' - выполнение внешней команды _cmd с аргументами. Вместо '{}' - подставляется имя файла; '\;' - признак конца аргументов (экранирующий слеш съедается шеллом).
Операторы:
- -a - AND применяется по умолчанию
- -o - OR
- \! - NOT
- \(...\) - группировка условий
В \! и \(...\) экранирующие слеши будут убраны шеллом.
Примеры
Поиск файлов определённого пользователя изменившихся за последние между часом и 30 минутами ранее и печать имени и времени модификации:
find /tmp -user mike -mmin -60 -mmin +30 -printf '%p %t\n'
Поиск файлов, содержащих строку 'example':
find /tmp -type f -exec grep -q example {} \; -print
Рекурсивная смена прав доступа на файлы:
chmod -R a-x mydir/* # Неправильно. Отберёт право на доступ к каталогам
find mydir -type f -exec chmod a-x {} \; # Правильно
Параллельное кодирование видеофайлов в каталоге в 8 потоков:
find ./video -type f -name \*.avi -print0 \
| xargs -0 -P 8 -n 1 -I {} ffmpeg -i {} -c:v libx264 -c:a copy {}.mp4