Aqui está uma maneira de combinar as melhores sugestões acima em uma linha de comando simples, eficiente e robusta:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Funciona bem com nomes de arquivos que começam com -ou contêm espaços. Observe o uso de -inamequal é a versão que não diferencia maiúsculas de minúsculas,-name por isso funcionará .JPGtão bem quanto .jpg.
Isso é usado findpara obter a lista de arquivos, em vez de o shell globbing com o *.jpgcuringa, o que pode resultar em um erro 'Lista de argumentos muito longa' em alguns sistemas. Embora como @enzotib aponte em um comentário, o comportamento de usar globbing em um loop for é diferente do que nos argumentos de um comando .
Além disso, findele manipulará subdiretórios, enquanto o globbing do shell não terá, a menos que você tenha recursos específicos do shell, como a **/*jpgsintaxe do globbing recursivo no zsh.
EDIT: Eu pensei em adicionar outro recurso útil, finddepois de ler um comentário de @IlmariKaronen sobre executar novamente o comando e apenas converter arquivos que foram alterados desde a primeira execução.
Na primeira passagem, você pode touchcriar um arquivo de carimbo de data e hora após a conclusão da conversão.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Em seguida, inclua -newer timestampna findexpressão para operar no subconjunto de arquivos cuja hora da última modificação é mais recente que o arquivo de carimbo de data / hora. Continue atualizando o arquivo de carimbo de data / hora após cada execução.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Essa é uma maneira fácil de evitar o recurso a um Makefile (a menos que você já esteja usando uma) e é outra boa razão pela qual vale a pena usá-la findsempre que possível ... tem expressividade versátil e permanece concisa.