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ąć?

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

+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"

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

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.



-1

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

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


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,
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.