Cómo crear de forma recursiva thumnbails en PDF en la command-line de Linux

Puedo usar ImageMagick para crear una miniatura de la primera página de un PDF usando:

convert -thumbnail x80 95.pdf[0] thumb_95.png 

Esto funciona bien y genera un file thumb_95.png .

He intentado varias permutaciones de "search" usando xargs, pero no puedo hacer funcionar un combo que creará las miniaturas en las carpetas junto con los files PDF de origen.

Los PDF están en carpetas nombradas con UUID, por ejemplo:

 /511017a7-67fc-4897-80c1-0d42ac100b68/415.pdf /511015bc-e0a8-4ab7-ba29-0ce9ac100b68/122.pdf 

Mi resultado requerido sería:

 /511017a7-67fc-4897-80c1-0d42ac100b68/415.pdf /511017a7-67fc-4897-80c1-0d42ac100b68/thumb_415.png /511015bc-e0a8-4ab7-ba29-0ce9ac100b68/122.pdf /511015bc-e0a8-4ab7-ba29-0ce9ac100b68/thumb_122.png 

Cualquier ayuda sobre las mejores maneras de lograr que esta conversión ocurra para todos * .pdf recursivamente sería muy apreciada.

Prueba esto:

find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {})' \;

Tuve que modificarlo ligeramente para:

find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {} .pdf)'.png \;

Para tener basename strip the filextension y luego agregar .png.

Gracias a todas las respuestas. ¡Este funcionó bien para mí!

La parte difícil es no tener un nombre de file del formulario testfile.pdf.png como resultado. Hace años tuve el mismo problema y lo resolví con este script auxiliar (adaptado un poco):

 #!/bin/bash SRCFRM=pdf TGTFRM=png FILE=$1 NEWFILE=$(echo $FILE | sed "s:$SRCFRM\$:$TGTFRM:") convert -thumbnail x80 $FILE[0] $NEWFILE 

Guárdelo en algún lugar, p. Ej. En su directory de inicio, y úselo así:

 find /path -name '*.pdf' -exec /path/to/converthelper.sh {} \; 

Tú quieres

  • Recurse a todos los PDF:

    1. Habilite globstar, con shopt -s globstar .
    2. Úselo para generar una list de todos los files *.pdf en el directory actual: **/*.pdf
    3. Crea un ciclo que itere sobre dichos files:

       for filename in **/*.pdf do something done 
  • Ahora, desea hacer algo en los files: algo se convert -thumbnail x80 95.pdf[0] thumb_95.png . Hay varias forms: generalmente uso basename , en este caso necesitaría $(dirname $filename)/$(basename $filename .pdf).png , pero otro enfoque interesante (y más simple) es usar las herramientas de manipulación de cadenas de bash :

    1. Eliminar .pdf del final del nombre del file: ${filename%.pdf}
    2. Agregar .png : ${filename%.pdf}.png

Finalmente, podemos unirlo todo (no olvide que esto requiere globstar, shopt -s globstar ):

 for filename in **/*.pdf do convert -thumbnail x80 $filename[0] ${filename%.pdf}.png done