Comment convertir tous les fichiers PDF en texte (dans un dossier) avec une seule commande?

18

Je sais que je peux convertir les fichiers pdf en fichiers texte un par un comme ceci:

$ pdftotext filename.pdf

Mais existe-t-il une seule commande qui ferait cette conversion sans spécifier de noms de fichiers séparés afin de les convertir tous?

Je vois ici, sur Wikipedia , que "les caractères génériques (*), par exemple $ pdftotext * pdf, pour convertir plusieurs fichiers, ne peuvent pas être utilisés car pdftotext n'attend qu'un seul nom de fichier."


la source

Réponses:

23

Les éléments suivants convertissent tous les fichiers du répertoire actuel:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done
Sam
la source
sa seule commande, elle peut être tapée sur une seule ligne du terminal (c'est le pdftotext à l'intérieur d'une boucle for dans une syntaxe à une ligne, ce qui est demandé par l'op)
Sam
consultez ces liens pour plus d'informations sur le fonctionnement de la boucle for: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/07/bash-for-loop-examples
Sam
cela ne causerait-il pas des problèmes avec les fichiers non pdf?
cprofitt
Cela ne produirait-il pas des fichiers comme "filename.pdf.txt"?
Ryan C. Thompson
oui, si c'est un problème, nous pourrions supprimer l'extension .pdf en utilisant 'sed' ou 'awk' mais cela ajouterait de la complexité à la commande
Sam
8
ls *.pdf | xargs -n1 pdftotext

xargsest souvent une solution rapide pour exécuter la même commande plusieurs fois avec juste un petit changement à chaque fois. L' -n1option garantit qu'un seul fichier pdf est transmis à pdftotext à la fois.

Edit: Si vous vous inquiétez des espaces dans les noms de fichiers et autres, vous pouvez utiliser cette alternative:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext
Ryan C. Thompson
la source
veuillez voir ma réponse: cette commande peut-elle être adaptée afin d'éviter le problème mentionné ici? cela ne signifie pas que votre solution n'est pas bonne, au contraire, elle fait quelque chose de très spécifique que les autres alternatives ici ne font pas. mais
2
Alternativement:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb
2

écrire un script bash

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

ou saisissez-le dans une commande sur une ligne comme suit:

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

J'espère que ça aide. Je n'ai pas un grand groupe de .pdfs pour tester cela, mais j'utilise cette stratégie pour convertir mes fichiers .flac en fichiers .ogg.

cprofitt
la source
peut-il être fait en ouvrant le terminal dans ce dossier et en exécutant une commande au lieu d'insérer le chemin manuellement?
ne pourriez-vous pas le coller ici en tant que tel et l'insérer dans votre réponse? ce serait une bonne réponse. je
la recherche et les xargs que j'ai initialement suggérés n'ont pas fonctionné lorsque j'ai eu la chance de les tester.
cprofitt
1

Je dois d'abord remercier Sam et Ryan Thompson ainsi que tous les autres répondeurs - car ma réponse ici n'est rien d'autre qu'une variation relative à la possibilité d'ajouter leurs solutions aux actions personnalisées de Thunar:

ainsi, comme toute commande de terminal, une commande pour convertir en texte tous les fichiers pdf d'un dossier peut être placée dans la liste des actions personnalisées dans le gestionnaire de fichiers Thunar

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

La commande qu'il y a find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext, (venant de Ryan Thompson ), c'est celle que je préfère utiliser, mais elle a un tour méchant ... voir ci-dessous ...

entrez la description de l'image ici

entrez la description de l'image ici

... c'est une commande amusante, à utiliser avec précaution: elle est faite pour convertir en texte tout le pdf dans le dossier où elle est tirée, donc, si elle est tirée par erreur dans le dossier d'accueil, elle aura des indésirables effets: tous vos fichiers PDF seront convertis en texte!

(Je l'ai testé comme ceci: j'ai créé un dossier appelé "test" sur le bureau et dedans un fichier pdf et une série de dossiers dans des dossiers ( /Desktop/test/a/b/c/e/f/g/h/i) contenant chacun le même pdf. L'exécution de cette commande dans /Desktop/testa converti tous les fichiers PDF en celui dans dossier "i".)

(Je serais heureux de recevoir des commentaires sur la façon d'ajuster cette commande afin d'éviter ce risque.)

En remplaçant cela par l'autre ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) venant de Sam , le problème est évité.

Mais dans certains cas, on pourrait souhaiter exactement ce que fait la solution de Ryan!

Communauté
la source
1
Vous pouvez éviter la findrecherche de commandes dans les sous-répertoires en utilisant -maxdepth 1. De plus, lorsque vous le mettez dans la fonction d'actions personnalisées de Thunar, vous devez probablement le remplacer find .par find %Fpour permettre à Thunar de passer correctement les chemins des répertoires sélectionnés.
Ryan C. Thompson,
0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Celui-ci génère sample.pdf.txt .

J'ai essayé d'utiliser celui-ci, comme le suggère user2357111317 et j'inclus également -layout pour préserver la mise en page du texte

for file in *.pdf; do pdftotext -layout "$file"; done
hinky
la source