Dlaczego moja rekurencyjna grep nie działa?

1

Znajduję się w katalogu nadrzędnym i chcę wyszukiwać dowolne pliki ODT (LibreOffice Writer) zawierające w nich wyrażenie „GWT”.

Jestem na pulpicie Ubuntu 12.04. Z terminala:

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

Wszystkie te obiekty systemu plików ( eclipse, scriptsitd.) to foldery.

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

Gdzie idę tutaj arye? Z góry dziękuję!

pnongrata
źródło
1
grep -i -r "GWT" \*.odt Ponieważ pliki odt nie są zwykłym tekstem, nie jestem do końca pewien dokładności wyników.
Fiisch
Dzięki @Fiisch (+1) - jednak taki sam wynik z Twoją sugestią ...
pnongrata
1
Poinstruujesz grep, aby rekurencyjnie przeszukiwał wszystkie katalogi z nazwami kończącymi się na .odt, nie przeglądać wszystkie katalogi i przeszukiwać tylko pliki zakończone na .odt.
n.st
Thanks @ n.st (+1) - więc .... jak mam zrobić to, co chcę (patrz pierwsze zdanie mojego pytania)?
pnongrata
1
@ Fiisch Właściwie nie musisz się przełączać find rozwiązać ten problem. grep oferuje kilka przydatnych opcji do wyszukiwania rekurencyjnego. Widzieć --include, --exclude, i --exclude-dir w man strona. Na przykład: grep -R --include '*.odt' -i 'GWT' *
dg99

Odpowiedzi:

3

Pliki ODT są w rzeczywistości plikami Zip (patrz https://stackoverflow.com/questions/4957212/how-does-open-office-compress-its-files ) powinieneś być w stanie przywrócić je za pomocą zipgrep polecenie z czymś takim:

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

vanthome
źródło
+1 dla zipgrep , ponieważ pliki ODT są skutecznie skompresowane i proste grep nie załatwi sprawy. To jednak nie pokaże, które pliki ODT zawierają ciąg.
Dennis
0

Zakładając, że używasz Bash 4, możesz wykonać następujące czynności:

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

Gdy opcja powłoki globstar jest ustawiony, ** rekurencyjnie dopasowuje wszystkie podkatalogi bieżącego katalogu. Drugi shopt polecenie usuwa polecenie; ten krok jest opcjonalny.

Jak wskazuje @vanthome, grepping plików ODT nic nie da, ponieważ są one skompresowane. Istnieją dwie niedogodności:

  1. The zipgrep Polecenie nie przyjmuje więcej niż jednej nazwy archiwum jako argumentu, więc musisz przejść przez wszystkie pliki ODT.
  2. zipgrep wydrukuje tylko pasującą linię (która może być bardzo długo w pliku ODT), więc nadal nie będziesz wiedział, które pliki zawierają ciąg.

Następujące wyniki mogą osiągnąć pożądane wyniki:

shopt -s globstar

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

shopt -u globstar

The dla pętla przechodzi przez wszystkie pliki ODT we wszystkich podkatalogach. Dla każdego znalezionego pliku rozpakowuje swoją zawartość do STDOUT. Następnie, grep wyszukuje żądany ciąg bez wysyłania czegokolwiek ( -q ). Jeśli dopasowanie zostanie znalezione, grep zwraca 0 i polecenie po logicznym AND ( && ) zostaje wykonane, więc nazwa pliku jest wyświetlana na terminalu.

Dennis
źródło