Lista plików zawierających określone słowo w tekście

30

Chciałbym wymienić rekursywnie i jednoznacznie pliki zawierające dane słowo.

Przykład : Sprawdzanie słowa „czek”, normalnie robię to grep

$ grep check * -R

Ale ponieważ występuje wiele słów tego słowa, otrzymuję wiele wyników. Muszę więc tylko wymienić nazwy plików zawierające podane słowo wyszukiwania. Wydaje mi się, że wystarczy sztuczka findi xargswystarczyłaby tutaj, ale nie jestem pewien.

Jakieś pomysły?

Mt.
źródło

Odpowiedzi:

39

Użyj opcji -llub --files-with-matches, która jest udokumentowana w następujący sposób:

Pomiń normalne wyjście; zamiast tego wypisz nazwę każdego pliku wejściowego, z którego normalnie wydrukowano by wyjście. Skanowanie zatrzyma się przy pierwszym dopasowaniu. ( -ljest określony przez POSIX).

Na przykład możesz użyć:

$ grep check * -lR
NN
źródło
Działa również na MSYS. Świetny!
Kos
2
Użyłem grep -rl "text to find" "/usr/share"i działało świetnie!
Shrout1
18
find . -type f -exec grep -l check {} +

Prawdopodobnie nie chcesz używać -Ropcji, która w nowoczesnych wersjach GNU greppodąża za dowiązaniami symbolicznymi podczas zstępujących katalogów. -rZamiast tego skorzystaj z opcji, która od wersji 2.12 (kwiecień 2012 r.) Nie korzysta już z dowiązań symbolicznych.

Jeśli twój grep nie jest GNU, lub jest starszy niż wersja 2.12, lub jeśli potrzebujesz, aby twój kod był przenośny w systemach GNU, które nie są tak zaawansowane, użyj findpowyższej komendy.

W przeciwnym razie możesz wykonać:

grep -rl check .

Nie używaj *(ponieważ pomijałoby to ukryte pliki w bieżącym katalogu (i tylko w bieżącym katalogu) i powodowałoby problemy dla plików, których nazwa zaczyna się na a -), unikaj przekazywania opcji po argumentach, ponieważ nie ma gwarancji, że będzie działać w zależności od środowisko i nie jest przenośny.

Stéphane Chazelas
źródło
1

Spróbuj tego:

find . -type f | xargs grep -c check $1 | grep -v ":0"

Jeśli chodzi o grepflagi ...

-c zwróci nazwę pliku, po której następuje: oraz liczbę wskazującą, ile razy szukany ciąg pojawia się w danym pliku.

-vpobierze dane wyjściowe z pierwszego grepwyszukiwania, odfiltruje pliki z zerowymi wynikami i wydrukuje tylko pliki z niezerowymi wynikami.

brightwellcd
źródło
Otrzymasz fałszywy negatyw, jeśli masz plik (i) lub reżyser (y), których nazwy zawierają :0. Lepiej to zrobić grep -v ':0$'. Nawet to dusi się w ścieżkach zawierających znaki nowej linii.
Scott
0

grep -rin "whatToFind" locationToFInd

np. $ grep -rin "vihaan".

będzie rekurencyjnie wyszukiwać i wyświetlać nazwy plików oraz odpowiadające im wiersze, które zawierają „vihaan”, „.” odnosi się do bieżącego katalogu.

Vihaan Verma
źródło
0
find . -type f | grep "keyword" *

szukaj w bieżącym katalogu. Aby wyszukać z katalogu głównego, określ /zamiast.

Maniraja Jorige
źródło
0

grep -lR "text-to-find" <where-to-find> działa również dobrze.

np. grep -lR "NAVIGATE" .gdzie znajdujemy słowo NAVIGATEw .bieżącym katalogu.

imsrgadich
źródło
-2
 grep -rli trim \` find . -name *.q \` 

Daje ci listę .qplików zawierających słowo kluczowetrim

Mithun
źródło