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
, scripts
itd.) 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ę!
linux
terminal
ubuntu-12.04
grep
pnongrata
źródło
źródło
grep -i -r "GWT" \*.odt
Ponieważ pliki odt nie są zwykłym tekstem, nie jestem do końca pewien dokładności wyników..odt
, nie przeglądać wszystkie katalogi i przeszukiwać tylko pliki zakończone na.odt
.find
rozwiązać ten problem.grep
oferuje kilka przydatnych opcji do wyszukiwania rekurencyjnego. Widzieć--include
,--exclude
, i--exclude-dir
wman
strona. Na przykład:grep -R --include '*.odt' -i 'GWT' *
Odpowiedzi:
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
źródło
Zakładając, że używasz Bash 4, możesz wykonać następujące czynności:
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:
Następujące wyniki mogą osiągnąć pożądane wyniki:
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.źródło