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 -iname
jest w wersji bez rozróżniania wielkości liter,-name
więc będzie działać .JPG
równie dobrze .jpg
.
find
Służy to do pobierania listy plików zamiast globowania powłoki za pomocą znaku *.jpg
wieloznacznego, 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ż find
zajmie podkatalogów, natomiast powłoka masek nie będzie, chyba że zdarzy się, że funkcje specyficzne dla powłoki takie jak **/*jpg
rekurencyjnego globowania składni w zsh.
EDYCJA: Pomyślałem, że dodam kolejną przydatną funkcję, o find
któ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 touch
zapisać plik znacznika czasu po zakończeniu konwersji.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Następnie dodaj -newer timestamp
do find
wyraż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ć, find
gdy tylko jest to możliwe ... ma wszechstronną ekspresję przy zachowaniu zwięzłości.