
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 zipgrep
folgenden 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:
- DerzipgrepDer Befehl akzeptiert nicht mehr als einen Archivnamen als Argument, Sie müssen also alle ODT-Dateien durchlaufen.
- 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.