Jak wyszukać słowo w całej zawartości katalogu w systemie Linux

15

trzeba wyszukać coś w całej treści

Próbuję:

find . | xargs grep word

Dostaję błąd:

xargs: niezakończony cytat

Jak to osiągnąć?

xyz
źródło

Odpowiedzi:

15

xargsoczekuje danych wejściowych w formacie, który nie jest generowany przez żadne inne polecenie, więc trudno jest je skutecznie wykorzystać. To, co dzieje się tutaj źle, to to, że masz plik, którego nazwa musi być cytowana na wejściu xargs(prawdopodobnie zawiera a ').

Jeśli twój grep obsługuje opcję -rlub -Rdla wyszukiwania rekurencyjnego, użyj go.

grep -r word .

W przeciwnym razie użyj -execgłównego z find. Jest to zwykły sposób osiągnięcia tego samego efektu, co xargsbez ograniczeń nazw plików. Niedawno najnowsze wersje findpozwalają grupować kilka plików w jednym wywołaniu polecenia pomocniczego. Przechodząc /dev/nulldogrep gwarantuje, że pokaże nazwę pliku przed każdym dopasowaniem, nawet jeśli zdarzy się, że zostanie wywołany w jednym pliku.

find . -type f -exec grep word /dev/null {} +

Starsze wersje find(w starszych systemach lub OpenBSD lub zredukowanych narzędziach, takich jak BusyBox) mogą wywoływać polecenie pomocnicze tylko w jednym pliku na raz.

find . -type f -exec grep word /dev/null {} \;

Niektóre wersje findi xargsmają rozszerzenia, które pozwalają im poprawnie się komunikować, używając znaków zerowych do oddzielania nazw plików, dzięki czemu nie jest wymagane cytowanie. Obecnie tylko OpenBSD ma tę funkcję bez -exec … {} +.

find . -type f -print0 | xargs -0 grep word /dev/null
Gilles „SO- przestań być zły”
źródło
+1 specjalnie dla /dev/null. Uciążliwe jest to, że format wyjściowy może się różnić w zależności od liczby dopasowanych plików ... dzięki.
Peter.O
12

Chyba masz na myśli pierwszą opcję

grep rekurencyjny, do wyszukiwania treści w plikach

grep -R "content_to_search" /path/to/directory

ls rekurencyjny, do wyszukiwania pasujących plików

ls -lR | grep "your_search"
Feida Kila
źródło
grep -rin for recursive-case_insensitive-show_line_number
Chcę móc przeszukiwać zawartość każdego pliku.
pierwszy zwraca dowolną wystąpienie w dowolnym pliku, określając plik, w którym znaleziono występowanie
2

Jeśli masz narzędzia GNU (które robisz, jeśli tag Linux jest dokładny), możesz użyć -print0i -0obejść zwykłe problemy z cytowaniem:

find . -type f -print0 | xargs -0 grep word
mu jest za krótki
źródło
0

Istnieje również ACK , jest zaprojektowany, aby przejść specjalne katalogi takie jak .svn,.git i takie. To codzienne narzędzie dla programistów.

Jest dość blisko dla popularnych przełączników.

Dawny. :

ack -r string .

Pakiet ack-grepna temat debiana i polubień debiana.

Gilles Quenot
źródło
0

W bieżącym katalogu możesz użyć grep:

 grep -irl root .
Ranjithkumar T.
źródło
-1

Myślę, że chcesz znaleźć ciąg w plikach

Próbować find . -name "*" | xargs grep -l "string"


źródło
Komunikat o błędzie od xargs („Niezakończony cytat”) oznacza, że ​​OP ma plik. który ma cytat w nazwie. Twoja linia również będzie na tym krzyczeć. Jak zauważył mu, potrzebujesz innego zakończenia.
thiton,