Come convertire tutti i file pdf in testo (all'interno di una cartella) con un comando?


18

So che posso convertire i file pdf in file di testo uno per uno in questo modo:

$ pdftotext filename.pdf

Ma c'è un singolo comando che farebbe quella conversione senza specificare nomi di file separati in modo da convertirli tutti?

Vedo qui, su Wikipedia , che "I caratteri jolly (*), ad esempio $ pdftotext * pdf, per convertire più file, non possono essere utilizzati perché pdftotext prevede solo un nome file".

pdf  text  convert  batch 

Risposte:


23

Quanto segue convertirà tutti i file nella directory corrente:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done

è un solo comando, può essere digitato in una riga nel terminale (è il pdftotext all'interno di un ciclo for in una sintassi di una riga, che è ciò che l'op ha richiesto)
Sam

controlla questi link per maggiori informazioni su come funziona il ciclo for: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam

ciò non causerebbe problemi con file non pdf?
cprofitt,

Questo non produrrebbe file come "nomefile.pdf.txt"?
Ryan C. Thompson,

sì, se questo è un problema, potremmo rimuovere l'estensione .pdf usando 'sed' o 'awk' ma aggiungerebbe complessità al comando
Sam

8
ls *.pdf | xargs -n1 pdftotext

xargsè spesso una soluzione rapida per eseguire lo stesso comando più volte con una piccola modifica ogni volta. L' -n1opzione assicura che solo un file pdf sia passato a pdftotext alla volta.

Modifica: se sei preoccupato per gli spazi nei nomi dei file e simili, puoi usare questa alternativa:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext

per favore vedi la mia risposta: quel comando può essere adattato in modo da evitare il problema menzionato lì? questo non significa che la tua soluzione non sia buona, al contrario, fa qualcosa di molto specifico che le altre alternative qui non lo fanno. ma ero solo curioso

2
In alternativa:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
Kenorb,

2

scrivere uno script bash

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

o digitalo in un comando di una riga come segue:

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

Spero che questo possa essere d'aiuto. Non ho un grande gruppo di .pdf per testarlo, ma uso questa strategia per convertire i miei file .flac in file .ogg.


può essere fatto aprendo il terminale in quella cartella ed eseguendo un comando invece di inserire manualmente il percorso?

non potresti incollarlo qui come tale e inserirlo nella tua risposta? sarebbe una buona risposta. non sono riuscito a raggiungere la buona formula semplicemente cancellando una parte di ciò che hai pubblicato

la ricerca e gli xarg inizialmente suggeriti non funzionavano quando ho avuto la possibilità di testarli.
cprofitt,

1

Devo ringraziare innanzitutto Sam e Ryan Thompson nonché tutti gli altri risponditori - per la mia risposta qui non è altro che una variazione relativa alla possibilità di aggiungere le loro soluzioni alle azioni personalizzate di Thunar:

quindi, come qualsiasi comando terminale, un comando per convertire in testo tutti i file pdf all'interno di una cartella può essere inserito nell'elenco delle azioni personalizzate nel file manager Thunar

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Il comando c'è find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext, (proveniente da Ryan Thompson ) è quello che preferisco usare, ma ha una brutta svolta ... vedi sotto ...

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

... è un comando divertente, da usare con cura: è fatto per convertire in testo tutto il pdf all'interno della cartella in cui viene sparato, quindi, se viene sparato per errore nella cartella home, avrà qualche indesiderato effetti: tutti i tuoi pdf saranno convertiti in testo!

(L'ho provato in questo modo: creato una cartella chiamata "test" sul desktop e in esso un file pdf e una serie di cartelle all'interno di cartelle ( /Desktop/test/a/b/c/e/f/g/h/i) contenenti ciascuna lo stesso pdf. L'esecuzione di questo comando in /Desktop/testha convertito tutti i pdf in quello in cartella "i".)

(Gradirei commenti su come regolare questo comando in modo da evitare tale rischio.)

Sostituendo quello con l'altro ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) proveniente da Sam , il problema è evitato.

Ma in alcuni casi si potrebbe desiderare esattamente cosa fa la soluzione di Ryan!


1
È possibile evitare il findcomando di ricerca nelle sottodirectory usando -maxdepth 1. Inoltre, quando lo metti nella funzione delle azioni personalizzate di Thunar, dovresti probabilmente sostituirlo find .con find %Fper consentire a Thunar di passare correttamente i percorsi delle directory selezionate.
Ryan C. Thompson,

0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Questo produce output.pdf.txt .

Ho provato a usare questo, come suggerito da user2357111317 e includo anche -layout per preservare il layout del testo

for file in *.pdf; do pdftotext -layout "$file"; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.