Warum funktioniert mein rekursives Grep nicht?

Warum funktioniert mein rekursives Grep nicht?

Ich befinde mich in einem übergeordneten Verzeichnis und möchte nach allen ODT-Dateien (LibreOffice Writer) suchen, die die Phrase „GWT“ enthalten.

Ich verwende den Ubuntu 12.04-Desktop. Vom Terminal aus:

myUser@myMachine:~/sandbox$ pwd
/home/myUser/sandbox
myUser@myMachine:~/sandbox$ ls
cloudflip  doctrang  eclipse   lookslike  scripts       squirrel  warlib

Alle diese Dateisystemobjekte ( eclipse, scripts, usw.) sind Ordner.

myUser@myMachine:~/sandbox$ grep -i -r "GWT" *.odt
grep: *.odt: No such file or directory

Wohin gehe ich hier? Vielen Dank im Voraus!

Antwort1

ODT-Dateien sind eigentlich Zip-Dateien (siehehttps://stackoverflow.com/questions/4957212/wie-komprimiert-open-office-seine-dateien) sollten Sie in der Lage sein, sie mit dem zipgrepfolgenden Befehl zu greppen:

find ~/sandbox -name "*.odt" -type f -print0 | xargs -0 zipgrep GWT

Antwort2

Vorausgesetzt, Sie verwenden Bash 4, können Sie Folgendes tun:

shopt -s globstar
grep -i GWT **/*.odt
shopt -u globstar

Wenn die Shell-OptionWeltstarist eingestellt,**rekursiv alle Unterverzeichnisse des aktuellen Verzeichnisses abgleicht. Die zweiteshoptBefehl hebt die Aktivierung des Befehls auf; dieser Schritt ist optional.

Wie @vanthome anmerkt, bringt das Greppen der ODT-Dateien nichts, da sie tatsächlich komprimiert sind. Es gibt zwei Nachteile:

  1. DerzipgrepDer Befehl akzeptiert nicht mehr als einen Archivnamen als Argument, Sie müssen also alle ODT-Dateien durchlaufen.
  2. zipgrepdruckt nur die passende Zeile (diesehrlong in einer ODT-Datei), daher wissen Sie immer noch nicht, welche Dateien die Zeichenfolge enthalten.

Die folgenden Punkte können möglicherweise zum gewünschten Ergebnis führen:

shopt -s globstar

for file in **/*.odt; do
    unzip -c "$file" | grep -iq GWT && echo "$file"
done

shopt -u globstar

DerfürDie Schleife durchläuft alle ODT-Dateien in allen Unterverzeichnissen. Für jede gefundene Datei wird der Inhalt nach STDOUT entpackt. Anschließendgrepsucht nach der gewünschten Zeichenfolge, ohne etwas auszugeben ( -q). Wenn eine Übereinstimmung gefunden wird,grepGibt 0 zurück und der Befehl nach dem logischen UND ( &&) wird ausgeführt, sodass der Dateiname auf dem Terminal ausgegeben wird.

verwandte Informationen