Gibt es eine Möglichkeit, PDF-Dateien mit der Kraft von grep zu durchsuchen, ohne zuerst in Ubuntu in Text zu konvertieren?
Kommentare
- Siehe auch Gibt es eine Art PDF-zu-Text-Konverter? und Befehlszeilentool zum Suchen von Phrasen in einer großen Anzahl von PDF-Dateien .
- Für Personen, die über die Suche hierher kommen: Wenn Sie bereit sind, sie zuerst in Textdateien zu konvertieren, haben Sie eine Schauen Sie sich an. Wie suche ich nach Inhalten mehrerer PDF-Dateien?
Antwort
Installieren Sie das Paket pdfgrep
und verwenden Sie dann den folgenden Befehl:
find /path -iname "*.pdf" -exec pdfgrep pattern {} +
—— ————
Einfachste Möglichkeit, dies zu tun:
pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf
Kommentare
- ies funktioniert auch in Mac OSX (Mavericks). Installieren Sie es mit Brew. Einfach. Danke.
- Aus Neugier habe ich die Quelle von pdfgrep überprüft und es verwendet Poppler, um Zeichenfolgen aus dem PDF zu extrahieren. Fast genau wie die Antwort von @wag ‚ nur seitenweise und nicht vermutlich das gesamte Dokument.
-
pdfgrep
auch hat ein rekursives Flag. Diese Antwort könnte also möglicherweise auf Folgendes reduziert werden:pdfgrep -R pattern /path/
. Es ist jedoch möglicherweise weniger effektiv, wenn jede Datei durchsucht wird, auch wenn es sich nicht um eine PDF-Datei ‚ handelt. Und ich stelle fest, dass es Probleme mit internationalen Zeichen wie å, ä und ö gibt . - Tatsächlich ist die Option
-n
ein Profi für pdfgrep, da sie es ermöglicht, die Seitenzahl in die Ausgabe aufzunehmen (kann für die weitere Verarbeitung hilfreich sein). - Diese Antwort wäre einfacher zu verwenden, wenn erklärt würde, welche Bits des Befehls wörtlich kopiert werden sollen und welche Platzhalter sind. Was ist ‚ s
pattern
? Was ist ‚ s{}
? Was ‚ ist mit dem `+` los? Ich habe beim ersten Lesen keine Ahnung … also gehe ich zur Manpage, nehme ich an.
Antwort
Wenn Sie poppler-utils
installiert haben (Standard unter Ubuntu Desktop), können Sie es im laufenden Betrieb „konvertieren“ und in grep
weiterleiten :
pdftotext my.pdf - | grep "pattern"
Dadurch wird keine TXT-Datei erstellt.
Kommentare
- also .. Sie extrahieren den Text, bevor Sie ihn erfassen, was bedeutet, dass die Antwort “ no “ lautet.
- @akira Das OP bedeutete wahrscheinlich „, ohne das PDF in einem Viewer zu öffnen und in Text zu exportieren “
- @akira Wo sehen Sie “ nur grep „?
- @akira Nun, ich habe bereits gesagt, was ich denke er meinte wahrscheinlich, er möchte ‚ nicht in Text exportieren, bevor er verarbeitet wird. Ich bezweifle sehr, dass er ein Problem mit einem Befehl hat, der co wandelt sich in irgendeiner Weise in Text um; ‚ gibt es keinen Grund,
- @sherrellbc nicht zu verwenden. Das zweite Argument von
pdftotext
ist der Dateiname, in den geschrieben werden soll . Konventionell können Sie mit Tools jedoch normalerweise instdout
anstatt in eine Datei schreiben, indem Sie stattdessen-
angeben. In ähnlicher Weise würden einige Tools standardmäßig instdout
schreiben, wenn Sie ein solches Argument vollständig weglassen (dies ist jedoch nicht immer möglich, ohne Mehrdeutigkeiten zu erzeugen).
Antwort
pdfgrep wurde genau für diesen Zweck geschrieben und ist in Ubuntu verfügbar.
Es versucht, größtenteils mit grep
kompatibel zu sein und bietet somit „die Kraft von grep“, das nur auf PDFs spezialisiert ist. Dazu gehören allgemeine Grep-Optionen wie --recursive
, --ignore-case
oder --color
. P. >
Im Gegensatz zu pdftotext | grep
kann pdfgrep die Seitenzahl einer Übereinstimmung performant ausgeben und ist im Allgemeinen schneller, wenn nicht das gesamte Dokument durchsucht werden muss (z --max-count
oder --quiet
).
Die grundlegende Verwendung lautet:
pdfgrep PATTERN FILE..
wobei PATTERN
Ihre Suchzeichenfolge und FILE
eine Liste von Dateinamen (oder Platzhaltern in einer Shell) ist.
Antwort
Nein.
Ein PDF besteht aus Datenblöcken, von denen einige Text, einige Bilder und einige wirklich magische XYZ-Dateien (z. B. .u3d-Dateien) sind Chunks werden meistens komprimiert (z. B. flach, überprüfen Sie http://www.verypdf.com/pdfinfoeditor/compression.htm ). Um „grep“ a . pdf Sie müssen die Komprimierung umkehren oder den Text extrahieren.
Sie können dies entweder pro Datei mit Tools wie pdf2text
tun und das Ergebnis erfassen, oder Sie führen einen „Indexer“ aus (siehe xapian.org oder lucene ), das einen durchsuchbaren Index aus Ihren PDF-Dateien erstellt, und dann können Sie den verwenden Suchmaschinen-Tools dieses Indexers, um den Inhalt des PDFs zu erhalten.
Aber nein, Sie können keine grep
PDF-Dateien erstellen und auf zuverlässige Antworten hoffen, ohne den Text zu extrahieren zuerst.
Kommentare
- Wenn man bedenkt, dass
pdfgrep
existiert (siehe oben), gibt es eine flache “ no “ ist falsch. - @JonathanCross, wenn man bedenkt, dass die Frage “ lautet Verwenden der Leistung von grep, ohne zuerst in Text zu konvertieren „, eine flache “ no “ ist korrekt.
Antwort
Recoll kann PDFs durchsuchen. Es unterstützt keine regulären Ausdrücke, verfügt jedoch über viele andere Suchoptionen, sodass es möglicherweise Ihren Anforderungen entspricht.
Antwort
Es gibt eine doppelte Frage zu StackOverflow. Die Leute dort schlagen eine Variation der Antwort von harish.venkarts vor:
find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \;
Der Vorteil gegenüber der ähnlichen Antwort hier ist die --with-filename
-Flag für grep. Dies ist auch pdfgrep etwas überlegen, da das Standard-grep mehr Funktionen bietet.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Kommentare
- Ich denke, es wäre besser gewesen, dies zu belassen als Kommentar (oder Bearbeitung) in der ähnlichen Antwort, auf die Sie sich beziehen.
Antwort
Schauen Sie sich das an im allgemeinen Ressourcen-Grep-Tool crgrep , das die Suche in PDF-Dateien unterstützt.
Es ermöglicht auch die Suche nach anderen Ressourcen wie in Archiven oder Datenbanken verschachtelten Inhalten Tabellen , Bild-Metadaten, POM-Dateiabhängigkeiten und Webressourcen – und Kombinationen davon einschließlich rekursiver Suche.
Antwort
Sie könnten Leiten Sie es zuerst durch strings
: –
cat file.pdf | strings | grep <...etc...>
Kommentare
- Verwenden Sie einfach
strings file.pdf | grep <...>
, Sie ‚ benötigencat
- Ja – mein Verstand scheint besser mit Streams zu funktionieren … 🙂
- funktioniert nicht, wenn Text komprimiert wird, was meistens der Fall ist.
- Auch wenn Der Text ist unkomprimiert. ‚ besteht im Allgemeinen aus kleinen Satzteilen (nicht unbedingt ganze Wörter!), die fein mit Formatierungsinformationen vermischt sind. Nicht sehr freundlich für
strings
odergrep
. - Können Sie sich einen anderen Grund vorstellen, warum die Verwendung von Zeichenfolgen dafür nicht ‚ funktioniert nicht? Ich habe festgestellt, dass die Verwendung von Zeichenfolgen bei einigen PDFs funktioniert, bei anderen jedoch nicht.
nicht
Antwort
Versuchen Sie dies
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done
zum Drucken der Zeilen, in denen das Muster im PDF-Format vorkommt
Antwort
Hier ist ein schnelles Skript für die PDF-Suche im aktuellen Verzeichnis:
#!/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" \;
Kommentare
- Ich kann dies nicht bearbeiten, da es zu wenig ist: Die
$1
im Suchaufruf sollte in Anführungszeichen gesetzt werden, da dies sonst ‚ nicht mit der Suche funktioniert Begriffe mit Leerzeichen. - @ankon hat es behoben 🙂
Antwort
CD an Ihr Ordner enthält Ihre PDF-Datei und dann ..
pdfgrep "pattern" your.pdf
oder wenn Sie in mehr als nur einer PDF-Datei suchen möchten (z. B. in allen PDF- Dateien in Ihrem Ordner)
pdfgrep "pattern" `ls *.pdf`
oder
pdfgrep "pattern" $(ls *.pdf)
Kommentare
- warum Verwenden Sie ls, um Dateinamen in Parameter einzufügen? ‚ ist nicht nur langsamer, sondern auch eine schlechte Idee, die Ausgabe
ls
als zu verwenden die Eingabe in andere Befehle . Nurpdfgrep 'pattern' *.pdf
ist genug - @phuclv Sie liegen falsch.
pdfgrep 'pattern' *.pdf
funktioniert nicht. - @ f0nzie Sie ‚ liegen falsch.
$(ls *.pdf)
ist fast genau dasselbe wie*.pdf
, nur schlimmer, weil speziell Dateien sind nicht in Anführungszeichen geschützt.
Antwort
Ich nehme an, Sie meinen, Sie müssen es nicht auf der Festplatte konvertieren kann sie in stdout
konvertieren und dann mit pdftotext
erfassen. Das PDF ohne jegliche Konvertierung zu durchsuchen, ist kein praktischer Ansatz, da PDF
meist ein Binärformat ist.
Im Verzeichnis:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
oder im Verzeichnis und seinen Unterverzeichnissen:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Auch weil einige pdf
Scans sind, müssen sie zuerst OCRed werden. Ich habe eine ziemlich einfache Methode geschrieben, um alle PDFs zu durchsuchen, die nicht grep
bearbeitet und OCR-fähig sind.
Ich habe festgestellt, ob eine pdf
hat keine Schriftart und kann normalerweise nicht durchsucht werden. Wenn wir dies wissen, können wir pdffonts
verwenden.
Die ersten beiden Zeilen der pdffonts
sind die Tabellenüberschriften. Wenn eine Datei durchsuchbar ist, werden mehr als zwei Zeilen ausgegeben. In diesem Wissen können wir Folgendes erstellen:
gedit check_pdf_searchable.sh
füge dann dieses ein
#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi
und mache es dann ausführbar
chmod +x check_pdf_searchable.sh
und liste dann alle auf Nicht durchsuchbare PDFs im Verzeichnis:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
oder im Verzeichnis und seinen Unterverzeichnissen:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Antwort
Wenn Sie nur nach PDF-Namen / -Eigenschaften suchen möchten … oder nach einfachen Zeichenfolgen, die nicht komprimiert oder codiert sind, dann statt strings
Sie können Folgendes verwenden:
grep -a STRING file.pdf cat -v file.pdf | grep STRING
Von 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
und cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
Antwort
gpdf ist möglicherweise das, was Sie benötigen, wenn Sie Gnome verwenden ! Überprüfen Sie dies , falls Sie Gnome nicht verwenden. Es enthält eine Liste der CLI-PDF-Viewer. Dann können Sie grep
verwenden, um ein Muster zu finden.
Antwort
pdfgrep -r --include "*.pdf" -i "pattern"
Kommentare
- Willkommen auf der Website und vielen Dank Sie für Ihren Beitrag. Können Sie erklären, was diese Optionen bedeuten? Dies könnte auch dazu beitragen, zu erklären, wie sich Ihr Ansatz von anderen Antworten auf diese Frage unterscheidet, die ebenfalls
pdfgrep
empfehlen.
Antwort
Der schnellste Weg ist
grep -rinw "pattern" --include \*.pdf *
Kommentare
- Willkommen auf der Website. Würde es Ihnen etwas ausmachen, Ihrer vorgeschlagenen Lösung weitere Erklärungen hinzuzufügen, um sie für Nichtfachleute zugänglicher zu machen? Beispielsweise sucht Ihre
grep
-Befehlszeile rekursiv in Unterverzeichnissen, von denen jemand, der nicht mitgrep
vertraut ist, möglicherweise nichts weiß. Außerdem haben Sie das Flag-i
eingefügt, obwohl das Ignorieren des Falls möglicherweise nicht immer das ist, was der Benutzer wünscht. Erklären Sie außerdem, inwiefern sich Ihr Ansatz von der Antwort von z. @phuclv und andere. - Wie AdminBee sagt, erfordert die Frage keine Suche ohne Berücksichtigung der Groß- und Kleinschreibung oder rekursive Verzeichnissuche. Die Optionen
-n
und-w
sind ebenfalls nicht durch die Frage gerechtfertigt. Noch wichtiger ist jedoch, dass in dieser Antwort beschrieben wird, wie Textdateien durchsucht werden, deren Namen mit.pdf
enden. Sie haben den Punkt der Frage verpasst.
Antwort
less mypdf.pdf | grep "Hello, World"