Rekurencyjne grep kończy się niepowodzeniem dla plików * .c


13

Próbowałem rekurencyjnie przeszukiwać wzór we wszystkich plikach .c w następujący sposób

> grep -lr search-pattern *.c

Ale dostałem to jako wynik

> grep: *.c: No such file or directory

Kiedy używam tego:

> grep -lr search-pattern *

Dostaję dużo. c plików w katalogach ze wzorem.

Co jest złego we wcześniejszym wyrażeniu?

Odpowiedzi:


22

Proponuję skorzystać z --includeopcji grep:

grep -lr --include='*.c' search-pattern .

1
+1. Nie znałem --include=GLOBopcji. W połączeniu z opcją rekurencyjną jest to bardzo potężne i nie wymaga find. Miły!
gertvdijk

Spóźniłem się na przyjęcie tutaj, ale jestem zdezorientowany, po .co jest koniec komendy.
Nathan Jones

1
@NathanJones: grep wymaga jednej lub więcej nazw plików lub katalogów do wyszukiwania. Kropka mówi: wyszukaj w bieżącym katalogu
enzotib

3

*.cWzór jest oceniany przez powłokę. Dotyczy to bieżącego katalogu, tak jak byś tego używał ls *.c.

Myślę, że zamiast tego chcesz znaleźć wszystkie pliki pasujące do *.cwzorca (rekurencyjnie) i grepwyszukać cię w nim. Oto sposób, aby to zrobić:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Służy xargsdo dołączania wyników wyszukiwania według find.


Alternatywnie użyj -execopcji, aby znaleźć, np .:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

Nie jestem też pewien, czy naprawdę chcesz tę -lopcję grep. Zatrzyma się przy pierwszym meczu:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)

Do find/xargsprzerwy składnię nazw zawierających spacje. -LMożliwość grepzatrzymania się na pierwszym meczu każdego pliku i kontynuować następnego pliku: jeśli ktoś chce tylko sprawdzić, czy wzór jest zawarty co najmniej raz w każdym danego pliku, to szybciej.
enzotib

@enzotib Dzięki, naprawiłem to używając -print0opcji i xargs --null.
gertvdijk

-1

Wiem, że to dość stary wątek, ale ponieważ miałem to samo pytanie, chcę podzielić się moim preferowanym sposobem osiągnięcia tego samego, w znacznie krótszej formie.

ls | grep "file.*.c"

2
Pytanie dotyczy wyszukiwania wzorca, a nie wyszukiwania pliku.
Jay
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.