A maneira POSIX é usar print . -type d ... | while read f; do
, mas a menos que você esteja obcecado com 100% de portabilidade, eu não me incomodaria com isso. Se você tem bash 4+ e pdfunite
(instalado por padrão no meu Ubuntu 13.04), você pode fazer isso em duas linhas:
shopt -s globstar
for f in ./**/; do pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done
Observe que shopt -s globstar
precisa estar em uma linha separada para o restante. Com o globstar ativado, **
se expande para todos os arquivos e diretórios no diretório atual, recursivamente. Como os arquivos não podem conter /
em seus nomes, **/
será expandido apenas para os diretórios. Eu uso ./**/
no caso improvável de que seus diretórios comecem com um hífen ( -
), pois isso pode causar problemas, pois muitos programas tratam qualquer coisa que comece com -
como uma opção.
Conforme escrito, isso não copiará os PDFs para outro diretório, mas isso é muito fácil de adicionar:
for f in ./**/; do cp "$f"/*.pdf /target/dir/; pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done
Se você quiser usar seu próprio script personalizado de combinação de PDF, simplesmente altere a linha para se adequar - mas lembre-se de que a essência do script de shell é unir comandos pré-existentes.
Aqui está uma versão um pouco mais portátil:
print . -type d -print0 | while read -d $'shopt -s globstar
for f in ./**/; do pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done
' f; do
pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"
done