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?
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?
Antworten:
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); } '
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. pdftotext
Stellen Sie sicher, dass der Befehl installiert ist, bevor Sie Recoll starten. Unter Debian und Ubuntu ist es im poppler-utils
Paket, 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"
pdftotext
(welche Tools wie Recoll automatisch ausführen).
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.
recoll
auf debian handlich installiert und versucht nun, es für meine Windows-basierten Mitarbeiter nutzbar zu machen.
Um rekursiv alle Dateien in Ihrem Home-Verzeichnis aufzulisten, die die PDF-Dateierweiterung haben und eine Zeile enthalten, die [iI]n Haskell
beispielsweise 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:
-exec
oder vermieden wird, xargs
weil 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../
') 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.$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.