Wie suche ich nach Inhalten mehrerer PDF-Dateien?

226

Wie kann ich den Inhalt von PDF-Dateien in einem Verzeichnis / Unterverzeichnis durchsuchen? Ich suche einige Kommandozeilen-Tools. Es scheint, dass grepPDF-Dateien nicht durchsucht werden können.

Jestin Joy
quelle
5
Grep funktioniert nicht, da PDF ein Binärformat ist und der Text häufig auf verschiedene Arten komprimiert oder codiert wird.
Mark Stephens
4
Hier ist eine GUI-Lösung: Adobe Reader, siehe wikispaces.psu.edu/display/training/…
Martin Thoma
3
Siehe auch
Flow
3
Adobe Reader funktioniert einwandfrei, indiziert jedoch nicht. Wenn Sie also viele Dateien haben, wird es langsam sein. Irgendeine Indizierungslösung?
Ruby

Antworten:

211

Ihre Distribution sollte ein Hilfsprogramm namens enthalten pdftotext :

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

Das "-" ist erforderlich, damit pdftotext in stdout und nicht in Dateien ausgegeben wird. Das--with-filename--label= Optionen und wird der Dateiname in die Ausgabe von grep eingefügt. Das optionale --colorFlag ist nett und weist grep an, mit Farben auf dem Terminal auszugeben.

(In Ubuntu, pdftotext wird durch das Paket xpdf-utilsoder bereitgestellt poppler-utils.)

Diese Methode mit pdftotextund grephat einen Vorteil gegenüber pdfgrepder Verwendung von Funktionen von GNU grep, pdfgrepdie nicht unterstützt werden. Hinweis : pdfgrep-1.3.x unterstützt die -COption zum Drucken von Kontextzeilen.

sjr
quelle
1
@Kurt Pfeifle Die von Ihnen vorgenommene Bearbeitung "(Edit by -kp-)" funktioniert nicht, da grepdie gedruckten Dateinamen gefiltert werden.
Raphael Ahrens
@sjr nein, obwohl die pdfgrepLösung für wirklich schnelle und einfache Suchen gut ist, möchte ich oft einen Kontext erhalten, da eine einzelne Zeile nicht hilfreich genug ist - also habe ich zu dieser Antwort hinzugefügt: Zum Beispiel können Sie hinzufügen die Option -C5 vor "Ihrem Muster", um 5 Kontextzeilen in die Ausgabe aufzunehmen - pdfgrep unterstützt dies nicht
Colin D Bennett
oh das ist cool, froh zu wissen, dass es Vorteile gibt, obwohl es für die meisten Leute viel weniger offensichtlich ist, wenn es tut
sjr
2
@sjr Nur zur Veranschaulichung: Ich verwende Ubuntu 12.10 und es pdfgrepist nutzlos. Es meldet eine enorme Menge an Müll auf Dateien, die es nicht verarbeiten kann. Ihre Lösung hat andererseits geholfen. Also bitte nicht löschen, auch nach 3 Jahren ist es noch hilfreich!
Ali
Ich konnte es auch in Cygwin verwenden, obwohl ich es zu einer Funktion mit dem Parameter machen musste, musste ich das "your_pattern" zu '$ 1' machen
Koshmaar
214

Es gibt pdfgrep , das genau das tut, was sein Name andeutet.

pdfgrep -R 'a pattern to search recursively from path' /some/path

Ich habe es für einfache Suchen verwendet und es hat gut funktioniert.

(Es gibt Pakete in Debian, Ubuntu und Fedora.)

Seit Version 1.3.0 unterstützt pdfgrep die rekursive Suche. Diese Version ist in Ubuntu seit Ubuntu 12.10 (Quantal) verfügbar.

Graeme
quelle
1
Von Natty (Ubuntu 11.04) aufwärts (siehe packages.ubuntu.com/… )
Martin Thoma
2
@pavon pdfgrephat jetzt diese Rekursionsoption, einschließlich, -Rum auch Symlinks zu folgen
Tobias Kienzler
30

Recoll ist eine fantastische Volltext-GUI- Suchanwendung für Unix / Linux, die Dutzende verschiedener Formate unterstützt, einschließlich PDF. Es kann sogar die genaue Seitenzahl und den Suchbegriff einer Abfrage an den Dokumentbetrachter übergeben und ermöglicht es Ihnen, direkt über die GUI zum Ergebnis zu springen.

Recoll verfügt außerdem über eine funktionsfähige Befehlszeilenschnittstelle und eine Webbrowser-Oberfläche .

Glutanimate
quelle
1
@Glutanimate Es wäre hilfreich (ich und möglicherweise auch andere), wenn Sie ein Beispiel für die ursprüngliche Frage hinzufügen könnten (Befehlszeilentool für die Suche in mehreren PDFs): Ich würde auch gerne sehen, wie eine Platzhaltersuche durchgeführt wird und wie gesucht wird das aktuelle Verzeichnis einschließlich aller Unterverzeichnisse . Wie würde das recoll / xapianin der Kommandozeile aussehen (ohne GUI)? Vielen Dank!
verrückt über natty
@ LeszekŻarna Vielleicht könntest du das Beispiel posten, das du getestet hast?
verrückt über natty
Das recoll Benutzerhandbuch enthält möglicherweise einige Hinweise, bietet jedoch eine eher technische und "nicht
themenbezogene
1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - Stackoverflow hat die Backticks um pwd gefressen.
Medoc
13

Meine aktuelle Version von pdfgrep (1.3.0) erlaubt Folgendes:

pdfgrep -HiR 'pattern' /path

Wenn Sie pdfgrep --help:

  • H: Drucken Sie den Dateinamen für jede Übereinstimmung.
  • i: Fallunterschiede ignorieren.
  • R: Verzeichnisse rekursiv durchsuchen.

Es funktioniert gut auf meinem Ubuntu.

Arkhi
quelle
7

Ich habe dieses zerstörerische kleine Drehbuch gemacht. Viel Spass damit.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}
phil
quelle
2
+1. Aber statt dem $filename.solltest du es einpfeifen grep.
Raphael Ahrens
3

Ich mag die Antwort von @ sjr, aber ich bevorzuge xargs vs -exec. Ich finde Xargs vielseitiger. Zum Beispiel können wir mit -P mehrere CPUs nutzen, wenn dies sinnvoll ist.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Deian
quelle
interessanter Punkt über xargs'Parallelverarbeitungsfähigkeit. Beachten Sie, dass Ihr --labelOptionsargument buchstäblich lautet {}, da der grepBefehl jetzt nicht mehr im Kontext von find's ausgeführt wird exec.
mklement0
2

Ich hatte das gleiche Problem und schrieb daher ein Skript, das alle PDF-Dateien im angegebenen Ordner nach einer Zeichenfolge durchsucht und die PDF-Dateien druckt, die mit der Abfragezeichenfolge übereinstimmen.

Vielleicht ist das hilfreich für Sie.

Sie können es hier herunterladen

Paul Weibert
quelle
Vielleicht nützlich, um das Skript in den Kommentar einzufügen?
Baxx
Ich habe Ihr Skript ausprobiert und es stellt sich heraus, dass es viel langsamer als die pdfgrepLösung oder der Einzeiler von sjr ist, und es hat mir einen laufenden Prozess hinterlassen, bei dem 100% eines CPU-Threads verwendet werden, selbst nachdem ich Strg-C zum Beenden verwendet habe.
Jason
2

Wenn Sie Dateinamen mit pdftotext anzeigen möchten, verwenden Sie den folgenden Befehl:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 
Aleksey Kontsevich
quelle
2

Es gibt ein anderes Dienstprogramm namens ripgrep-all , das auf ripgrep basiert .

Es kann mehr als nur PDF-Dokumente wie Office-Dokumente und -Filme verarbeiten, und der Autor behauptet, es sei schneller als pdfgrep.

Befehlssyntax zum rekursiven Durchsuchen des aktuellen Verzeichnisses, und das zweite beschränkt sich nur auf PDF-Dateien:

rga 'pattern' .
rga --type pdf 'pattern' .
oschoudhury
quelle
1

Es gibt ein Open-Source- Grep- Tool für allgemeine Ressourcen, crgrep das in PDF-Dateien sucht, aber auch in anderen Ressourcen wie in Archiven verschachtelten Inhalten, Datenbanktabellen, Bild-Metadaten, POM-Dateiabhängigkeiten und Webressourcen - und Kombinationen davon, einschließlich rekursiver Suche.

Die vollständige Beschreibung auf der Registerkarte "Dateien" deckt weitgehend ab, was das Tool unterstützt.

Ich habe crgrep als OpenSource-Tool entwickelt.

Craig
quelle
Craig - hast du eine Verbindung zu diesem Projekt? Wenn ja, sollten Sie dies in Ihrer Antwort angeben. Ich sage das, weil Sie gerade eine praktisch identische Antwort auf zwei andere alte Fragen gepostet haben ...
Stephen C
Aktualisierter Beitrag, um zu verdeutlichen, dass ich der Autor von crgrep bin
Craig
1

Konvertieren Sie zuerst alle Ihre PDF-Dateien in Textdateien:

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

Dann grepwie gewohnt verwenden. Dies ist besonders gut, da es schnell ist, wenn Sie mehrere Abfragen und viele PDF-Dateien haben.

Martin Thoma
quelle
Dies geschieht in Kombination mit ag github.com/ggreer/the_silver_searcher . Kann Psychedeliks Gb in Mikrosekunden analysieren. Flat Files fürs Leben
NVRM
0

Sie benötigen einige Tools wie pdf2text, um Ihr PDF zuerst in eine Textdatei zu konvertieren und dann im Text zu suchen. (Sie werden wahrscheinlich einige Informationen oder Symbole vermissen).

Wenn Sie eine Programmiersprache verwenden, sind wahrscheinlich PDF-Bibliotheken für diesen Zweck geschrieben. zB http://search.cpan.org/dist/CAM-PDF/ für Perl

Nylon Lächeln
quelle
0

Versuchen Sie, 'acroread' in einem einfachen Skript wie dem oben genannten zu verwenden

acathur
quelle