10 votes

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

J'utilise Opensuse 10.3 et j'aimerais connaître des outils en ligne de commande pour rechercher des phrases 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 astuces grep ici ?

0 votes

0 votes

Je veux d'abord connaître les outils en ligne de commande et s'il y a des outils GUI, alors ce sera bien aussi Wingrep est seulement sous Windows. Et je veux rechercher uniquement des fichiers pdf, donc une application optimisée pour cela serait agréable à avoir.

1 votes

6voto

user42723 Points 161
SEARCH\_DIR="/some/dir/where/you/want/to/search/";
SEARCH\_STRING="whatever-you-are-searching";
    \# extracting text from pdf
pdftotext "file.pdf" "file.txt"

# connecting with grep
pdftotext "file.pdf" /dev/stdout |grep -H --label="file.pdf" -- "$SEARCH\_STRING"

# if you want grep to show only file list of matching pdf file, add --files-with-matches
pdftotext "file.pdf" /dev/stdout |grep -H --label="file.pdf" --files-with-matches -- "$SEARCH\_STRING"

# find possible list of pdf to search from
find "$SEARCH\_DIR" -type f -name '\*.pdf' > list-of-pdf.txt
    \# everything joined by awk as duct tape, sent to bash for processing
# double quote is escaped as x22 inside awk.
find "$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

    \# With out bash. Further process to match your need
find "$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){
 print "For file \["$0"\] we have match \["ret"\]";
 # do whatever you like. 
};
close(EXEC);
}'

0 votes

Je suppose que vous n'avez pas remarqué la partie de la question qui mentionnait "Windows XP" ou le Windows-search étiquette. Je sais que la question a (confusément) commencé par "openSUSE" mais il y a plus de références Windows que de références Linux, surtout si on compte son commentaire ultérieur également.

0 votes

@Synetech : Il a rejeté une réponse avec "Wingrep est seulement sous Windows", ce qui suggère qu'il veut une solution Linux.

0 votes

@Mechanicalsnail, il l'a rejeté parce que c'est un outil GUI là où il a demandé un outil en ligne de commande.

4voto

Sous Linux et Windows, vous pouvez utiliser Acrobat Reader, qui dispose d'une commande permettant de 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 devraient être très rapides ; les recherches de phrases devraient être raisonnables. Assurez-vous que le pdftotext est installée avant de lancer Recoll ; sous Debian et Ubuntu, elle se trouve dans le répertoire poppler-utils paquet, 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 "exact phrase to search"
grep -r --include '\*.txt' -l -E "regular expression to search"

0 votes

Adobe ne permet pas de faire des recherches dans un répertoire entier, mais seulement dans un fichier. Je veux d'abord connaître les outils de ligne de commande et s'il existe des outils d'interface graphique, ce sera bien aussi.

0 votes

Adobe Reader 9 sous Linux possède une entrée de menu "Edit | Search" qui vous permet de rechercher dans tous les fichiers PDF d'un répertoire. En ligne de commande, toutes les méthodes que je connais impliquent un pas de pdftotext (ce que des outils tels que Recoll feront automatiquement).

1 votes

+1 pour Recoll. L'indexation des fichiers vous fera gagner du temps si vous en avez beaucoup et que vous les recherchez fréquemment.

1voto

stendabrog Points 11

Adobe Reader X fait le travail et il fait permet de rechercher dans un répertoire entier et ses sous-répertoires, et pas seulement à l'intérieur d'un fichier, mais ce n'est pas un programme en ligne de commande.

0 votes

Est-ce que c'est dans la dernière version d'Acrobat X ? Quelle version ?

0 votes

J'ai essayé l'outil d'indexation d'Acrobat et le qualifier de primitif est un compliment. recoll installé sur debian sans problème, j'essaie maintenant de le rendre utilisable pour mes employés sous Windows.

0voto

James Haigh Points 564

Pour lister de manière récursive tous les fichiers de votre répertoire personnel qui ont l'extension de fichier PDF et qui contiennent une ligne qui correspond à l'expression rationnelle ''. [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 cela ne soit pas particulièrement nécessaire pour cet exemple, j'ai construit ce système en évitant l'utilisation de -exec o xargs parce que, pour des raisons de sécurité Je pense que c'est une bonne pratique de prendre l'habitude de le faire. Changement ' -execdir à -exec et $PWD${0#?} à $0 devrait donner le même résultat dans ce cas.
  • Au lieu d'utiliser gants pour le filtrage des noms de fichiers, il peut s'avérer utile d'utiliser la plus grande puissance expressive de la fonction expressions régulières et de faire du filtrage sur l'ensemble du chemin. J'ai inclus la pratique ici pour montrer comment cela peut être fait. Notez que le chemin qui est soumis au filtrage est le chemin qui devrait normalement être imprimé. Le fait qu'il soit relatif ou absolu dépend du ou des arguments de chemin donnés, qui, s'ils sont émis, correspondent par défaut au répertoire de travail actuel (' ./ '). Dans cet exemple, les chemins recherchés sont tous absolus (c'est-à-dire qu'ils commencent par ' '). / ') car ' ~/ ' est étendu au chemin absolu du répertoire personnel de l'utilisateur actuel, et c'est le seul argument de chemin.
  • Le $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 précédée du 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 le nom du fichier plutôt que le chemin du fichier. ' ${0:2} ' dépouille les deux premiers caractères de $0 c'est-à-dire le ./ mais elle n'est apparemment pas reconnue par sh .

Bien sûr, adaptez-le à vos besoins.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X