Outil en ligne de commande pour rechercher des phrases dans un grand nombre de fichiers pdf

9

J'utilise Opensuse 10.3 et j'aime connaître les outils de ligne de commande pour rechercher des expressions dans un grand nombre de fichiers pdf dans un répertoire. Sous Windows XP, la recherche dans l'explorateur le permet mais est trop lente. Y a-t-il des conseils grep ici?

iceman
la source
wingrep.com ! :)
Apache
Je veux d'abord connaître les outils de ligne de commande et s'il y a des outils GUI, alors ce sera bien aussi .. Wingrep est uniquement sous Windows. Et je veux rechercher uniquement les fichiers pdf, donc une application optimisée pour cela serait bien d'avoir
iceman
1
Question similaire à Unix Stack Exchange
Gilles 'SO- arrête d'être mal'

Réponses:

6
SEARCH_DIR = "/ some / dir / where / you / want / to / search /";
SEARCH_STRING = "quoi que vous cherchiez";
# extraire le texte d'un pdf
pdftotext "file.pdf" "file.txt"

# connexion avec grep
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING"

# si vous voulez que grep affiche uniquement la liste des fichiers du fichier pdf correspondant, ajoutez --files-with-matches
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-matches - "$ SEARCH_STRING"

# trouver une liste possible de pdf à rechercher
trouver "$ SEARCH_DIR" -type f -name '* .pdf'> list-of-pdf.txt
# tout rejoint par awk sous forme de ruban adhésif, envoyé à bash pour traitement
# les guillemets doubles s'échappent en tant que x22 dans awk.
trouver "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
print "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Sans coup bas. Processus supplémentaire pour répondre à vos besoins
trouver "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 imprimer "Pour le fichier [" $ 0 "], nous avons la correspondance [" ret "]";
 # faites ce que vous voulez. 
};
fermer (EXEC);
} '
user42723
la source
Je suppose que vous n'avez pas remarqué la partie de la question qui mentionnait «Windows XP» ou la balise de recherche Windows . Je sais que la question (confusément) a commencé avec «openSUSE» , mais il y a plus de références Windows que de références Linux; surtout lorsque vous comptez également son commentaire ultérieur .
Synetech
@Synetech: Il a rejeté une réponse avec "Wingrep n'est que sous Windows", ce qui suggère qu'il veut une solution Linux.
Escargot mécanique
@Mechanicalsnail, il l'a rejeté car il s'agit d'un outil GUI où a demandé un outil en ligne de commande.
Synetech
3

Sous Linux et Windows, vous pouvez utiliser Acrobat Reader, qui a une commande pour rechercher plusieurs fichiers.

Sous Linux, il y a Recoll, qui construira un index de vos fichiers pdf (et plus) la première fois que vous l'exécuterez. Une fois l'index construit, les recherches de mots doivent être très rapides; les recherches de phrases doivent être raisonnables. Assurez - vous que la pdftotextcommande est installé avant de commencer Recoll; sous Debian et Ubuntu, c'est dans le poppler-utilspaquet, je ne sais pas pour Suse.

Ou vous pouvez directement convertir les fichiers en texte et utiliser grep sur les fichiers texte avec les commandes ci-dessous.

find -name '* .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F "expression exacte à rechercher"
grep -r --include '* .txt' -l -E "expression régulière à rechercher"
Gilles 'SO- arrête d'être méchant'
la source
adobe ne permettrait pas de rechercher sous un répertoire entier, il le ferait juste à l'intérieur d'un fichier. Je veux d'abord connaître les outils de ligne de commande et s'il y a des outils GUI, alors ce sera bien aussi
iceman
Adobe Reader 9 sous Linux possède une entrée de menu "Edition | Rechercher" qui vous permet de rechercher dans tous les fichiers PDF d'un répertoire. Sur la ligne de commande, toutes les méthodes que je connais impliquent une étape pdftotext(dont les outils tels que Recoll feront automatiquement).
Gilles 'SO- arrête d'être méchant'
1
+1 pour Recoll. L'indexation des fichiers vous fera gagner du temps si vous en avez beaucoup et que vous les recherchez fréquemment.
Escargot mécanique
1

Adobe Reader X fait le travail et il ne permet la recherche dans un répertoire entier et les sous - répertoires, non seulement dans un fichier, mais il est pas un programme de ligne de commande.

stendabrog
la source
est-ce dans la dernière version d'Acrobat X? quelle version?
iceman
J'ai essayé l'outil d'indexation Acrobat et l'appeler primitif est un compliment. recollinstallé sur Debian à la main, essayant maintenant de le rendre utilisable pour mes employés Windows.
Chris K
0

Pour lister récursivement tous les fichiers de votre répertoire personnel qui ont l'extension de fichier PDF et qui contiennent une ligne qui correspond à l'expression régulière ' [iI]n Haskell' par exemple, vous pouvez émettre:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

Remarques:

  • Bien que ce ne soit pas particulièrement nécessaire pour cet exemple, j'ai construit cela en évitant l'utilisation de -execou xargsparce que, pour des raisons de sécurité , je pense que c'est une bonne pratique de prendre l'habitude de le faire. Changer ' -execdir' en ' -exec' et ' $PWD${0#?}' en ' $0' devrait obtenir le même résultat dans ce cas.
  • Au lieu d'utiliser des globes pour la mise en correspondance des motifs avec les noms de fichiers, il peut être utile d'utiliser la plus grande puissance expressive des expressions régulières et de faire correspondre les motifs sur l'ensemble du chemin. J'ai inclus la pratique ici pour montrer comment cela peut être fait. Notez que le chemin qui correspond à un motif est le chemin qui serait normalement imprimé. Qu'il soit relatif ou absolu dépend du ou des arguments de chemin d'accès donnés, qui s'ils sont émis par défaut dans le répertoire de travail actuel (' ./'). Dans cet exemple, les chemins mis en correspondance sont tous absolus (c'est-à-dire commencent par ' /') car ' ~/' est étendu au chemin absolu du répertoire personnel de l'utilisateur actuel, et c'est le seul argument de chemin.
  • Les ' $0' et ' $1' sont des paramètres positionnels utilisés de manière à citer correctement les arguments. Si cela n'est pas fait correctement, la commande est vulnérable aux noms de fichiers arbitraires.
  • ' ${0#?}' supprime le premier caractère de $0, c'est-à-dire le ' .'.

Pour imprimer chaque ligne correspondante, procédez par le nom de fichier:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

Cette variante utilise ' -H' au lieu de ' -l' et les étiquettes avec nom de fichier plutôt que chemin de fichier. ' ${0:2}' supprime les deux premiers caractères de $0, c'est-à-dire le ' ./', mais il n'est apparemment pas reconnu par sh.

Bien sûr, ajustez vos besoins.

James Haigh
la source