Wie finde ich rekursiv eine DOC-Datei, die ein bestimmtes Wort enthält?

9

Ich benutze Bash unter Ubuntu.

Derzeit funktioniert dies gut für das aktuelle Verzeichnis:

catdoc *.doc | grep "specificword" 

Aber ich habe viele Unterverzeichnisse mit DOC-Dateien.

Wie kann ich rekursiv nach "spezifischem Wort" suchen?

Tom
quelle
1
und vielleicht auch den Namen der Datei zurückgeben, die das Wort enthält?
Tom

Antworten:

11

Verwendung findfür rekursive Suchen:

find -name '*.doc' -exec catdoc {} + | grep "specificword"

Dadurch wird auch der Dateiname ausgegeben:

find -name '*.doc' | while read -r file; do
    catdoc "$file" | grep -H --label="$file" "specificword"
done

(Normalerweise würde ich verwenden find ... -print0 | while read -rd "" file, aber es besteht möglicherweise eine Wahrscheinlichkeit von 0,0001%, dass dies notwendig ist, also habe ich aufgehört, mich zu kümmern.)

user1686
quelle
Dank Grawity funktioniert der erste Vorschlag gut. Gibt es eine Möglichkeit, den Dateinamen zu drucken? Es wird nur die Phrase gedruckt, in der sie gefunden wurde.
Tom
1
@user: Probieren Sie den zweiten Vorschlag aus, der übrigens den Titel "Dadurch wird auch der Dateiname ausgegeben" trägt.
user1686
kann wahrscheinlich ein wenig vereinfachen:find -name \*.doc -exec sh -c "catdoc '{}' | grep -q 'specificword' && echo {}" \;
Glenn Jackman
5

Vielleicht möchten Sie sich recoll ansehen , ein Volltextsuchwerkzeug für Linux- und Unix-Systeme, das viele verschiedene Dokumentformate unterstützt. Es ist jedoch indexbasiert, dh es muss die Dokumente, in denen Sie suchen möchten, vor der eigentlichen Suche indizieren. (Danke an Pabouk für diesen Hinweis).

Es gibt auch eine GUI und eine Kommandozeile.

Weitere Informationen finden Sie in der Dokumentation .

Robert Jakob
quelle
1
Vielleicht ist es erwähnenswert, dass Recoll eine indizierte Suche bietet. Zuerst muss es die Dokumente indizieren, dann kann es die Indizes durchsuchen.
Pabouk
1

Grep sollte binäre Übereinstimmungen finden mit:

find /path/to/dir -name '*.doc' exec grep -l "specificword" {} \;
Xenoaktiv
quelle