Вот способ, который объединяет лучшие из приведенных выше предложений в простую, эффективную и надежную командную строку:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Он отлично работает с именами файлов, которые начинаются с -или содержат пробелы. Обратите внимание, использование -inameкоторого является регистронезависимой версией, -nameпоэтому она будет работать .JPGтак же хорошо, как и .jpg.
Он используется findдля получения списка файлов вместо оболочки с использованием *.jpgподстановочного знака, что может привести к ошибке «Список аргументов слишком длинный» в некоторых системах. Хотя, как указывает @enzotib в комментарии, поведение использования globbing в цикле for отличается от поведения аргументов команды .
Кроме того, он findбудет обрабатывать подкаталоги, в то время как глобальное копирование оболочки не будет происходить, если только у вас не появятся специфические для оболочки функции, такие как **/*jpgсинтаксис рекурсивного глобирования в zsh.
РЕДАКТИРОВАТЬ: Я подумал, что добавлю еще одну полезную функцию, о findкоторой я подумал после прочтения комментария @IlmariKaronen о повторном запуске команды и преобразовании только тех файлов, которые изменились с первого запуска.
На первом проходе вы можете touchполучить файл метки времени после того, как преобразование будет завершено.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Затем добавьте -newer timestampк findвыражению для работы с подмножеством файлов, время последнего изменения которых новее, чем у файла отметки времени. Продолжайте обновлять файл меток времени после каждого запуска.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Это простой способ избежать необходимости прибегать к Makefile (если вы его еще не используете), и это еще одна веская причина, по которой его стоит использовать, findкогда это возможно ... он обладает универсальной выразительностью при сохранении краткости.