Odpowiedzi:
xargs
oczekuje 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ę -r
lub -R
dla wyszukiwania rekurencyjnego, użyj go.
grep -r word .
W przeciwnym razie użyj -exec
głównego z find
. Jest to zwykły sposób osiągnięcia tego samego efektu, co xargs
bez ograniczeń nazw plików. Niedawno najnowsze wersje find
pozwalają grupować kilka plików w jednym wywołaniu polecenia pomocniczego. Przechodząc /dev/null
dogrep
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 find
i xargs
mają 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
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"
Jeśli masz narzędzia GNU (które robisz, jeśli tag Linux jest dokładny), możesz użyć -print0
i -0
obejść zwykłe problemy z cytowaniem:
find . -type f -print0 | xargs -0 grep word
W bieżącym katalogu możesz użyć grep:
grep -irl root .
Myślę, że chcesz znaleźć ciąg w plikach
Próbować find . -name "*" | xargs grep -l "string"
/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.