2016-04-27 40 views
6

Następujące polecenie wyszukuje wszystkie wystąpienia jakiegoś napisu „” przez rekursywnie przeszukiwaniu bieżącym katalogu i wszystkich podkatalogówBash: Rurociągi Znajdź w Grep

grep -r -n 'some string' . 

Polecenie rekurencyjnie przeszukuje bieżącym katalogu i wszystkich pod- katalogi i zwraca wszystkie pliki w postaci * .axvw

find . -name '*.axvw' 

chcę umieścić te dwa polecenia razem więc mogę wszystkich wystąpień o „” przez jakiś ciąg rekursywnie przeszukiwaniu katalogu bieżącym, ale tylko patrząc na pliki, które kończą w 'axvw ".

Kiedy próbowałem uruchomiona komenda następujące nic nie zostało zwrócone:

find . -name '*js' | grep -n 'some string' 

Co robię źle?

+1

Zobacz podane tutaj odpowiedzi: http://serverfault.com/questions/9822/recursive-text-search-with-grep-and-file-patterns –

+0

Możliwy duplikat [Jak korzystać rurę wewnątrz -exec w znalezieniu] (https://stackoverflow.com/questions/21825393/how-to-use-pipe-within-exec-in-find) – koppor

Odpowiedz

8

Można użyć -exec opcję w find:

find . -name '*.axvw' -exec grep -n 'some string' {} + 

Albo użyć xargs:

find . -name '*.axvw' -print0 | xargs -0 grep -n 'some string' 
+2

'-exec grep -n 'jakiś ciąg' {} +' sprawi, że podejście 'find -exec' będzie konkurencyjne względem xargs na wydajności i jest gwarantowane, że będzie dostępne w specyfikacji POSIX z 2006 roku. –

+0

Dzięki, tak, dobry punkt na temat używania '+' zamiast '\;' – anubhava

1

find . -name '*js' -exec grep -n 'some string' {} \;

Powinna działać myślę.

Edycja: dla zabawy, można również użyć podwójnego grep.

find . | grep 'some string' | grep js

+1

Nie, sugerowany przez ciebie "podwójny grep" nie pomaga - w obu etapach jest pomijanie nazw plików, a nie zawartości. –