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 -iname
qual é a versão que não diferencia maiúsculas de minúsculas,-name
por isso funcionará .JPG
tão bem quanto .jpg
.
Isso é usado find
para obter a lista de arquivos, em vez de o shell globbing com o *.jpg
curinga, 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, find
ele manipulará subdiretórios, enquanto o globbing do shell não terá, a menos que você tenha recursos específicos do shell, como a **/*jpg
sintaxe do globbing recursivo no zsh.
EDIT: Eu pensei em adicionar outro recurso útil, find
depois 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 touch
criar 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 timestamp
na find
expressã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 find
sempre que possível ... tem expressividade versátil e permanece concisa.