find + xargs

Поиск файлов 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