¿Cómo convertir todos los archivos pdf a texto (dentro de una carpeta) con un comando?

18

Sé que puedo convertir archivos PDF a archivos de texto uno por uno como este:

$ pdftotext filename.pdf

Pero, ¿hay un solo comando que realice esa conversión sin especificar nombres de archivo separados para convertirlos a todos?

Veo aquí, en Wikipedia , que "Los comodines (*), por ejemplo $ pdftotext * pdf, para convertir múltiples archivos, no se pueden usar porque pdftotext solo espera un nombre de archivo".


fuente

Respuestas:

23

Lo siguiente convertirá todos los archivos en el directorio actual:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done
Sam
fuente
es un solo comando, puede escribirse en una línea en la terminal (es el pdftotext dentro de un bucle for en una sintaxis de una línea, que es lo que solicitó el operador)
Sam
echa un vistazo a estos enlaces para obtener más información de cómo funciona el bucle for: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam
¿Esto no causaría problemas con los archivos que no son pdf?
cprofitt
¿No produciría esto archivos como "filename.pdf.txt"?
Ryan C. Thompson, el
sí, si eso es un problema, podríamos eliminar la extensión .pdf usando 'sed' o 'awk' pero agregaría complejidad al comando
Sam
8
ls *.pdf | xargs -n1 pdftotext

xargsA menudo es una solución rápida para ejecutar el mismo comando varias veces con solo un pequeño cambio cada vez. La -n1opción asegura que solo se pase un archivo pdf a pdftotext a la vez.

Editar: si le preocupan los espacios en los nombres de archivo y demás, puede usar esta alternativa:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext
Ryan C. Thompson
fuente
vea mi respuesta: ¿se puede adaptar ese comando para evitar el problema mencionado allí? Esto no significa que su solución no sea buena, por el contrario, hace algo muy específico que las otras alternativas aquí no hacen. pero tenía curiosidad
2
Como alternativa:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb
2

escribir un script bash

for f in *.pdf; do
  pdftotext "$f"
done

o escríbalo en un comando de una línea de la siguiente manera:

for f in *.pdf; do pdftotext "$f"; done

Espero que esto ayude. No tengo un gran grupo de archivos .pdf para probar esto, pero uso esta estrategia para convertir mis archivos .flac en archivos .ogg.

cprofitt
fuente
¿Se puede hacer abriendo el terminal en esa carpeta y ejecutando un comando en lugar de insertar la ruta manualmente?
¿No podría pegarlo aquí como tal e insertarlo en su respuesta? Esa sería una buena respuesta. no pude alcanzar la buena fórmula simplemente borrando una parte de lo que publicaste
El hallazgo y los xargs que sugerí inicialmente no funcionaron cuando tuve la oportunidad de probarlos.
cprofitt
1

Primero tengo que agradecer a Sam y a Ryan Thompson , así como a todos los demás respondedores; mi respuesta aquí no es más que una variación relacionada con la posibilidad de agregar sus soluciones a las acciones personalizadas de Thunar:

entonces, como cualquier comando de terminal, un comando para convertir a texto todos los archivos pdf dentro de una carpeta se puede colocar en la lista de acciones personalizadas en el administrador de archivos Thunar

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

El comando que hay find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext, (proveniente de Ryan Thompson ) es el que prefiero usar, pero tiene un giro desagradable ... ver más abajo ...

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

... es un comando divertido, que debe usarse con cuidado: está hecho para convertir a texto todos los archivos PDF dentro de la carpeta donde se dispara, por lo tanto, si se dispara por error en la carpeta de inicio, tendrá algunos no deseados efectos: ¡todos sus archivos PDF se convertirán en texto!

(Lo probé así: creé una carpeta llamada "prueba" en el escritorio y en ella un archivo pdf y una serie de carpetas dentro de carpetas ( /Desktop/test/a/b/c/e/f/g/h/i) cada una conteniendo el mismo pdf. Ejecutar ese comando /Desktop/testha convertido todos los archivos PDF a eso en carpeta "i".)

(Agradecería comentarios sobre cómo ajustar este comando para evitar ese riesgo).

Reemplazando eso con el otro ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) proveniente de Sam , se evita el problema.

¡Pero en ciertos casos uno podría desear exactamente lo que hace la solución de Ryan!

Comunidad
fuente
1
Puede evitar que el findcomando busque en subdirectorios utilizando -maxdepth 1. Además, al ponerlo en función de las acciones personalizadas de Thunar, probablemente debería reemplazar find .a find %Fpermitir Thunar para pasar correctamente las rutas de los directorios seleccionados.
Ryan C. Thompson
0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Éste genera sample.pdf.txt .

He intentado utilizar éste, como sugieren user2357111317 y también incluyo -layout a conservar el diseño del texto

for file in *.pdf; do pdftotext -layout "$file"; done
chiflado
fuente