Ось спосіб, який поєднує найкраще з вищезазначених пропозицій у простий, ефективний, надійний командний рядок:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Він добре працює з іменами, які починаються з -
пробілів або містять їх. Зауважте, використання -iname
яких є нечутливою до регістру версією, -name
тому вона буде працювати .JPG
так само добре .jpg
.
Це використовується find
для отримання списку файлів замість обшивки оболонки з *.jpg
підстановкою, що може призвести до помилки "Аргумент занадто довгий" у деяких системах. Хоча як в коментарі вказує @enzotib, поведінка використання глобулінгу в циклі for for відрізняється від аргументів команди .
Крім того, find
буде оброблено підкаталоги, тоді як глобальна оболонка не буде, якщо у вас не буде специфічних для оболонки функцій, таких як **/*jpg
рекурсивний синтаксис глобалізації в zsh.
EDIT: Я думав, що я додам ще одну корисну особливість, про 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
коли це можливо ... він має універсальну виразність, залишаючись лаконічним.