Oto sposób, który łączy najlepsze z powyższych sugestii w prosty, wydajny i niezawodny wiersz poleceń:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Działa dobrze z nazwami plików, które zaczynają się od -lub zawierają spacje. Zauważ, że użycie -inamejest w wersji bez rozróżniania wielkości liter,-name więc będzie działać .JPGrównie dobrze .jpg.
findSłuży to do pobierania listy plików zamiast globowania powłoki za pomocą znaku *.jpgwieloznacznego, co może powodować błąd „zbyt długiej listy argumentów” w niektórych systemach. Chociaż @enzotib wskazuje w komentarzu, zachowanie przy użyciu globowania w pętli for jest inne niż w przypadku argumentów polecenia .
Również findzajmie podkatalogów, natomiast powłoka masek nie będzie, chyba że zdarzy się, że funkcje specyficzne dla powłoki takie jak **/*jpgrekurencyjnego globowania składni w zsh.
EDYCJA: Pomyślałem, że dodam kolejną przydatną funkcję, o findktórej pomyślałem po przeczytaniu komentarza @IlmariKaronen na temat ponownego uruchomienia polecenia i konwertowania tylko plików, które zmieniły się od pierwszego uruchomienia.
Przy pierwszym przejściu możesz touchzapisać plik znacznika czasu po zakończeniu konwersji.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Następnie dodaj -newer timestampdo findwyrażenia, aby działało na podzbiorze plików, których czas ostatniej modyfikacji jest nowszy niż plik znacznika czasu. Kontynuuj aktualizowanie pliku sygnatury czasowej po każdym uruchomieniu.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Jest to łatwy sposób na uniknięcie konieczności korzystania z pliku Makefile (chyba że już go używasz) i jest to kolejny dobry powód, dla którego warto go używać, findgdy tylko jest to możliwe ... ma wszechstronną ekspresję przy zachowaniu zwięzłości.