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.


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
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.


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.


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 .


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.


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
}

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"

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


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" 

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' .

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 - 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.


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


0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.