Befehlszeilentool zum Suchen von Phrasen in einer großen Anzahl von PDF-Dateien

9

Ich verwende Opensuse 10.3 und möchte Kommandozeilen-Tools kennen, um Phrasen in einer großen Anzahl von PDF-Dateien in einem Verzeichnis zu suchen. In Windows XP erlaubt die Explorer-Suche dies, ist aber zu langsam. Gibt es hier grep Tipps?

Eismann
quelle
wingrep.com ! :)
Apache
Ich möchte zuerst die Befehlszeilentools kennen und wenn es GUI-Tools gibt, ist es auch schön. Wingrep ist nur unter Windows verfügbar. Und ich möchte nur PDF-Dateien durchsuchen, daher wäre eine dafür optimierte Anwendung schön
iceman
1
Ähnliche Frage bei Unix Stack Exchange
Gilles 'SO - hör auf böse zu sein'

Antworten:

6
SEARCH_DIR = "/ some / dir / where / you / want / to / search /";
SEARCH_STRING = "was auch immer Sie suchen";
# Text aus pdf extrahieren
pdftotext "file.pdf" "file.txt"

# Verbindung mit grep
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING"

# Wenn grep nur die Dateiliste der passenden PDF-Datei anzeigen soll, fügen Sie --files-with-match hinzu
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --Dateien mit Übereinstimmungen - "$ SEARCH_STRING"

# Finden Sie eine mögliche Liste von PDFs, nach denen gesucht werden soll
Finden Sie "$ SEARCH_DIR" -Typ f-Name '* .pdf'> Liste-von-pdf.txt
# alles zusammen mit awk als Klebeband, zur Verarbeitung an bash gesendet
# doppeltes Anführungszeichen wird als x22 in awk maskiert.
find "$ SEARCH_DIR" -Typ 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

# Ohne Bash. Weiterer Prozess, der Ihren Anforderungen entspricht
find "$ SEARCH_DIR" -Typ 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 "Für Datei [" $ 0 "] haben wir Übereinstimmung [" ret "]";
 # Mach, was immer du willst. 
};
schließen (EXEC);
} '
user42723
quelle
Ich denke, Sie haben den Teil der Frage, in dem „Windows XP“ oder das Windows-Such- Tag erwähnt wurden, nicht bemerkt . Ich weiß, dass die Frage (verwirrt) mit "openSUSE" begann , aber es gibt mehr Windows-Referenzen als Linux-Referenzen. vor allem, wenn Sie auch seinen nachfolgenden Kommentar zählen .
Synetech
@Synetech: Er lehnte eine Antwort mit "Wingrep ist nur unter Windows" ab, was darauf hindeutet, dass er eine Linux-Lösung will.
Mechanische Schnecke
@Mechanicalsnail, er lehnte es ab, weil es ein GUI-Tool ist, bei dem nach einem Befehlszeilen-Tool gefragt wurde.
Synetech
3

Sowohl unter Linux als auch unter Windows können Sie Acrobat Reader verwenden, der über einen Befehl zum Durchsuchen mehrerer Dateien verfügt.

Unter Linux gibt es Recoll, das beim ersten Ausführen einen Index Ihrer PDF-Dateien (und mehr) erstellt. Nachdem der Index erstellt wurde, sollte die Wortsuche sehr schnell sein. Phrasensuche sollte vernünftig sein. pdftotextStellen Sie sicher, dass der Befehl installiert ist, bevor Sie Recoll starten. Unter Debian und Ubuntu ist es im poppler-utilsPaket, ich weiß nichts über Suse.

Oder Sie können die Dateien direkt in Text konvertieren und mit den folgenden Befehlen grep für die Textdateien verwenden.

find -name '* .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F "genaue zu suchende Phrase"
grep -r --include '* .txt' -l -E "regulärer Ausdruck für die Suche"
Gilles 'SO - hör auf böse zu sein'
quelle
Adobe würde es nicht erlauben, unter einem ganzen Verzeichnis zu suchen, sondern nur innerhalb einer Datei. Ich möchte zuerst Kommandozeilen-Tools kennen und wenn es GUI-Tools gibt, dann wird es auch schön sein
iceman
Adobe Reader 9 unter Linux verfügt über einen Menüeintrag "Bearbeiten | Suchen", mit dem Sie alle PDF-Dateien in einem Verzeichnis durchsuchen können. In der Befehlszeile umfassen alle mir bekannten Methoden einen Schritt pdftotext(welche Tools wie Recoll automatisch ausführen).
Gilles 'SO - hör auf böse zu sein'
1
+1 für Recoll. Das Indizieren der Dateien spart Zeit, wenn Sie viel haben und sie häufig durchsuchen.
Mechanische Schnecke
1

Adobe Reader X macht den Job und es tut Suche unter einem ganzen Verzeichnis ermöglichen und Verzeichnissen, nicht nur innerhalb einer Datei, aber es ist nicht ein Kommandozeilenprogramm.

stendabrog
quelle
ist das in der neuesten Version von Acrobat X? welche Veröffentlichung?
Iceman
Ich habe das Acrobat-Indizierungswerkzeug ausprobiert und es als primitiv zu bezeichnen, ist ein Kompliment. recollauf debian handlich installiert und versucht nun, es für meine Windows-basierten Mitarbeiter nutzbar zu machen.
Chris K
0

Um rekursiv alle Dateien in Ihrem Home-Verzeichnis aufzulisten, die die PDF-Dateierweiterung haben und eine Zeile enthalten, die [iI]n Haskellbeispielsweise dem regulären Ausdruck ' ' entspricht, können Sie Folgendes ausgeben:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

Bemerkungen:

  • Obwohl es für dieses Beispiel nicht besonders notwendig ist, habe ich dies so konstruiert, dass die Verwendung von -execoder vermieden wird, xargsweil ich aus Sicherheitsgründen denke, dass es eine gute Praxis ist, sich daran zu gewöhnen. Das Ändern von ' -execdir' in ' -exec' und ' $PWD${0#?}' in ' $0' sollte in diesem Fall das gleiche Ergebnis erzielen.
  • Anstatt Globs für die Musteranpassung der Dateinamen zu verwenden, kann es nützlich sein, die größere Ausdruckskraft regulärer Ausdrücke zu verwenden und die Musteranpassung über den gesamten Pfad durchzuführen . Ich habe die Praxis hier aufgenommen, um zu zeigen, wie es gemacht werden kann. Beachten Sie, dass der Pfad, mit dem das Muster übereinstimmt, der Pfad ist, der normalerweise gedruckt wird. Ob es relativ oder absolut ist, hängt von den angegebenen Pfadargumenten ab, die standardmäßig an das aktuelle Arbeitsverzeichnis (' ./') ausgegeben werden . In diesem Beispiel sind die Pfade, mit denen abgeglichen wird, alle absolut (dh beginnen mit ' /'), da ' ~/' auf den absoluten Pfad des Ausgangsverzeichnisses des aktuellen Benutzers erweitert wird und dies das einzige Pfadargument ist.
  • Die ' $0' und ' $1' sind Positionsparameter, die so verwendet werden, dass die Argumente korrekt zitiert werden. Wenn dies nicht ordnungsgemäß ausgeführt wird, ist der Befehl für beliebige Dateinamen anfällig.
  • ' ${0#?}' entfernt das erste Zeichen von $0, dh das ' .'.

So drucken Sie jede übereinstimmende Zeile mit dem Dateinamen:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

Diese Variante verwendet ' -H' anstelle von ' -l' und Beschriftungen mit Dateinamen anstelle von Dateipfad. ' ${0:2}' entfernt die ersten beiden Zeichen von $0, dh das ' ./', aber es wird anscheinend nicht von erkannt sh.

Natürlich können Sie Ihre Bedürfnisse anpassen.

James Haigh
quelle