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ę!


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:



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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.