Chciałbym rekurencyjnie i niepowtarzalnie wymienić pliki, które zawierają dane słowo.

Przykład : Sprawdzanie słowa „check”, normalnie to grep

$ grep check * -R 

Ale ponieważ jest wiele wystąpień tego słowa, otrzymuję dużo wyników. Muszę więc tylko wypisać nazwy plików, które zawierają podane wyszukiwane słowo. Myślę, że jakaś sztuczka z find i xargs wystarczyłaby tutaj, ale nie jestem pewien.

Jakieś pomysły?

Odpowiedź

Użyj -l lub --files-with-matches, która jest udokumentowana następująco:

Wyłącza normalne wyjście; zamiast tego wypisuje nazwę każdego pliku wejściowego, z którego wynik zostałby normalnie wydrukowany. Skanowanie zatrzyma się na pierwszym meczu. (-l jest określone przez POSIX.)

Na przykład możesz użyć następującego:

$ grep check * -lR 

Komentarze

  • Działa również na MSYS. Świetnie!
  • Użyłem grep -rl "text to find" "/usr/share" i działało świetnie!

Odpowiedź

find . -type f -exec grep -l check {} + 

Prawdopodobnie nie chcesz używać opcji -R, która we współczesnych wersjach GNU grep podąża za dowiązaniami symbolicznymi podczas opadania katalogów. Zamiast tego użyj opcji -r, która od wersji 2.12 (kwiecień 2012) nie występuje już po dowiązaniach 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 do systemów non-bleeding-edge-GNU, użyj find powyżej.

W przeciwnym razie możesz:

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 w przypadku plików, których nazwa zaczyna się od -), unikaj przekazywania opcje po argumentach, ponieważ to nie jest gwarantowane są przystosowane do pracy w zależności od środowiska i nie są przenośne.

Odpowiedź

Spróbuj tego:

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

Jeśli chodzi o flagi grep

-c będzie zwraca nazwę pliku, po której następuje: oraz liczbę wskazującą, ile razy szukany ciąg występuje w podanym pliku.

-v pobierze dane wyjściowe z pierwszego grep wyszukuj, odfiltruj pliki z zerowymi wynikami i wydrukuj tylko te pliki z wynikami niezerowymi.

Komentarze

  • Spowoduje to wyświetlenie fałszywie ujemnego wyniku, jeśli masz plik (i) (lub dyrektora (y)), których nazwy zawierają :0. Lepiej jest ' zrobić grep -v ':0$'. Nawet to dusi się na ścieżkach zawierających znaki nowej linii.

Odpowiedź

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

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

Odpowiedz

grep -rin „whatToFind” locationToFInd

np. $ grep -rin „vihaan”.

rekurencyjnie przeszuka i wyświetli nazwy plików oraz odpowiadające im linie, które zawierają „vihaan”, „.” odnosi się do bieżącego katalogu.

Odpowiedź

find . -type f | grep "keyword" * 

Szukaj w bieżącym katalogu. Aby wyszukać z katalogu głównego, podaj / zamiast .

Odpowiedź

 grep -rli trim \` find . -name *.q \` 

Podaj listę .q plików zawierających słowo kluczowe trim

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *