Existe-t-il un moyen de rechercher des fichiers pdf en utilisant la puissance de grep, sans convertir au préalable en texte dans Ubuntu?
Existe-t-il un moyen de rechercher des fichiers pdf en utilisant la puissance de grep, sans convertir au préalable en texte dans Ubuntu?
Réponses:
Installez le paquet pdfgrep
, puis utilisez la commande:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
Le plus simple est
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
a également un drapeau récursif. Donc , cette réponse pourrait peut-être réduite à: pdfgrep -R pattern /path/
. Bien que cela puisse être moins efficace s'il parcourt tous les fichiers, même s'il ne s'agit pas d'un PDF. Et je remarque qu’il a des problèmes avec les caractères internationaux tels que å, ä et ö.
-n
option est un pro pour pdfgrep car elle permet d'inclure le numéro de page dans la sortie (peut être utile pour un traitement ultérieur).
pattern
? C'est quoi {}
? Qu'est-ce qui se passe avec le `+`? Je n'en ai aucune idée en première lecture ... donc je pars pour la page de manuel, je suppose.
Si vous avez poppler-utils
installé (par défaut sur Ubuntu Desktop), vous pouvez le "convertir" à la volée et le rediriger vers grep
:
pdftotext my.pdf - | grep 'pattern'
Cela ne créera pas de fichier .txt.
pdftotext
est le nom du fichier dans lequel il doit écrire. Cependant, par convention, les outils vous permettent généralement d’écrire au stdout
lieu de dans un fichier en spécifiant un -
. De même, certains outils écrivent stdout
par défaut si vous omettez complètement un tel argument (mais cela n’est pas toujours possible sans créer d’ambiguïté).
pdfgrep a été écrit exactement à cette fin et est disponible dans Ubuntu.
Il essaie d'être principalement compatible avec grep
et fournit ainsi "la puissance de grep", spécialisé uniquement pour les PDF. Cela inclut les options communes de grep, telles que --recursive
, --ignore-case
ou --color
.
À la différence de pdftotext | grep
, pdfgrep peut afficher le numéro de page d'une correspondance de manière performante et est généralement plus rapide lorsqu'il n'est pas nécessaire de chercher dans tout le document (par exemple --max-count
ou --quiet
).
L'utilisation de base est:
pdfgrep PATTERN FILE..
où PATTERN
est votre chaîne de recherche et FILE
une liste de noms de fichiers (ou des caractères génériques dans un shell).
Non.
Un fichier PDF est constitué de blocs de données, dont certains sous forme de texte, certaines d’images, et certains d’entre eux très magiques comme XYZ (par exemple, des fichiers .u3d). Ces morceaux sont la plupart du temps compressés (par exemple, à plat, consultez http://www.verypdf.com/pdfinfoeditor/compression.htm ). Afin de "grep" un .pdf, vous devez inverser la compression ou extraire le texte.
Vous pouvez le faire par fichier avec des outils tels que pdf2text
et grep le résultat, ou vous exécutez un 'indexeur' (regardez xapian.org ou lucene ) qui construit un index interrogeable à partir de vos fichiers .pdf et vous pouvez ensuite utiliser la recherche. outils de moteur de cet indexeur pour obtenir le contenu du pdf.
Mais non, vous ne pouvez pas grep
créer de fichiers pdf et espérer des réponses fiables sans extraire le texte au préalable.
pdfgrep
existe (voir ci-dessus), un "non" plat est incorrect.
Recoll peut rechercher des PDF. Il ne prend pas en charge les expressions régulières, mais il possède de nombreuses autres options de recherche, il peut donc répondre à vos besoins.
Vous pouvez le faire passer en strings
premier: -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, vous n'avez pas besoincat
strings
ou grep
.
Jetez un coup d'œil à l'outil de ressources communes grep crgrep, qui prend en charge la recherche dans les fichiers PDF.
Il permet également de rechercher d'autres ressources telles que du contenu imbriqué dans des archives, des tables de base de données, des métadonnées de l'image, des dépendances de fichiers POM et des ressources Web, ainsi que des combinaisons de celles-ci, notamment la recherche récursive.
essaye ça
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
pour l'impression des lignes, le motif apparaît à l'intérieur du pdf
Allez dans votre dossier contenant votre fichier pdf et ensuite ..
pdfgrep 'pattern' your.pdf
ou si vous voulez chercher dans plus d'un fichier pdf (par exemple dans tous les fichiers pdf de votre dossier)
pdfgrep 'pattern' `ls *.pdf`
ou
pdfgrep 'pattern' $(ls *.pdf)
ls
sortie comme entrée pour d’autres commandes . Juste pdfgrep 'pattern' *.pdf
est suffisant
Il y a une question en double sur StackOverflow. Les gens là-bas suggèrent une variante de harish.venkarts répondent:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
L'avantage sur la réponse similaire ici est le --with-filename
drapeau pour grep. Ceci est également un peu supérieur à pdfgrep, car le grep standard a plus de fonctionnalités.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Voici un script rapide pour la recherche pdf dans le répertoire actuel:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage $0 VALUE" 1>&2
exit 1
fi
echo 'SEARCH IS CASE SENSITIVE' 1>&2
find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;
Je suppose que vous voulez dire que vous ne voulez pas le convertir sur le disque, vous pouvez les convertir stdout
puis le grep pdftotext
. Grepping le pdf sans aucune sorte de conversion n'est pas une approche pratique puisqu'il PDF
s'agit principalement d'un format binaire.
Dans le répertoire:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
ou dans le répertoire et ses sous-répertoires:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
De plus, comme certaines pdf
numérisations sont numérisées, elles doivent d'abord faire l'objet d'une reconnaissance optique. J'ai écrit un moyen assez simple de rechercher tous les fichiers PDF qui ne peuvent pas être édités grep
et OCR.
J'ai remarqué que si un pdf
fichier n'a aucune police, il est généralement impossible de le rechercher. Donc, sachant cela, nous pouvons utiliser pdffonts
.
L'en pdffonts
-tête de la table est composé des deux premières lignes . Ainsi, lorsqu'un fichier est interrogeable, il produit une sortie de plus de deux lignes. Sachant cela, nous pouvons créer:
gedit check_pdf_searchable.sh
puis coller ceci
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
puis le rendre exécutable
chmod +x check_pdf_searchable.sh
puis répertoriez tous les fichiers PDF non interrogeables dans le répertoire:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
ou dans le répertoire et ses sous-répertoires:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Si vous souhaitez simplement rechercher des noms / propriétés au format PDF ... ou des chaînes simples qui ne sont ni compressées ni codées, strings
vous pouvez utiliser la liste ci-dessous à la place de
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
De grep --help
:
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
et cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB