O problema é que, se você encontrar um diretório sem arquivos de imagem correspondentes, o glob é passado não expandido para o comando convert, portanto, você acaba tentando converter arquivos com o nome literal ./*jpg
, ./*png
e assim por diante. / p>
A solução usual para isso (no bash e em outros shells que o suportam) é permitir globbing nulo . Infelizmente, neste caso, isso cria um erro diferente, já que agora você está chamando convert
sem nenhum arquivo de entrada.
Não consigo pensar em uma maneira mais elegante de lidar com isso, exceto definir nullglob
, expandir os globs em uma matriz e, em seguida, testar explicitamente se a matriz está vazia ou não. Então, por exemplo:
find $PWD -type d -execdir bash -c '
shopt -s nullglob
files=(""/*.jpg ""/*.png)
if (( ${#files[@]} == 0 )); then
echo ": nothing to do here"
else
convert "${files[@]}" ".pdf"
fi' bash {} \;
ou mais compactamente
find $PWD -type d -execdir bash -c '
shopt -s nullglob
files=(""/*.jpg ""/*.png)
(( ${#files[@]} == 0 )) || convert "${files[@]}" ".pdf"
' bash {} \;
ou, assumindo a liderança do @Zanna e eliminando find
:
#!/bin/bash
shopt -s globstar
shopt -s nullglob
for f in **/*; do
[[ -d "$f" ]] || continue
files=( "$f"/*.jpg "$f"/*.png )
(( ${#files[@]} != 0 )) || continue
convert "${files[@]}" "$f.pdf"
done