Grep w plikach z określonym rozszerzeniem w katalogu

11

Czy istnieje polecenie umożliwiające wyszukiwanie słowa kluczowego w plikach w katalogu o określonym rozszerzeniu?

Ciąg grep -irn "string" ./pathdaje rekurencyjne wyszukiwanie wszystkich plików w katalogu ./path. Moim szczególnym wymaganiem jest wyszukiwanie we wszystkich plikach ./pathz rozszerzeniem, takim jak*.h

Ginu Jacob
źródło

Odpowiedzi:

11

Po kilku próbach myślę, że grep -irn 'string' --include '*.h'jest to bardziej przydatne

Ginu Jacob
źródło
1
Jeśli masz zamiar to zrobić, pamiętaj o wpisaniu "*.h"cudzysłowów.
G-Man mówi „Reinstate Monica”
Działa z cytatami i bez nich
Ginu Jacob
3
Teraz to robi. Spróbuj utworzyć plik o nazwie foobar.hw bieżącym katalogu i spróbuj ponownie.
G-Man mówi „Reinstate Monica”
10

S i (obrót) moduł SH Ell opcjonalnie jonów globstarpoleceniem

    shopt -s globstar

Spowoduje to, że **jako składnik nazwy pliku będzie oznaczać wszystko tutaj i poniżej. Więc path/**oznacza wszystko w pathkatalogu i jego podkatalogów . (Nie musisz ./tutaj pisać .) Następnie możesz użyć

grep -in "string" path/**/*.h

aby przeszukać wszystkie .hpliki do i poniżej path.


Można u nzad opcji z shopt -u.

G-Man mówi „Przywróć Monikę”
źródło
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ipor Sircer
źródło
1
-exec... też +jest dobre.
G-Man mówi „Reinstate Monica”
1
Właśnie zauważyłem - zapomniałeś dołączyć "string"do swojej odpowiedzi!
G-Man mówi „Przywróć Monikę”
3

Jeśli możesz zainstalować coś na swoim komputerze, sugeruję użycie ack .

Możesz zrobić z nim dokładnie to, czego potrzebujesz i wiele więcej. W przypadku użycia możesz:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filtry dla plików h
  • -i ignoruje wielkość liter

Aby dowiedzieć się, które filtry plików są obsługiwane natywnie, uruchom polecenie ack --help=type.

OGŁOSZENIE
źródło
Jest też ag , były klon potwierdzenia. Dawniej, ponieważ ich zestawy funkcji od tego czasu nieco się rozeszły.
8bittree
Nie znałem ag. Dzięki za udostępnienie.
AD
3

A co z tym?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Wyjaśnienie:

  • -L: śledź dowiązania symboliczne
  • -nazwa: za pomocą gwiazdki można opisać rozszerzenia
  • -w: to samo co twoja propozycja, ale „r” jest zastąpione findpoleceniem
  • {}: oznacza wynik findpolecenia
  • \; : w przypadku połączenia findz -exec, jest to specyfikator końca polecenia
Dominique
źródło
1
Jak "*.h"działa Myślałbym, że to musi być'*.h'
Joe
Zawsze pracuję z podwójnymi cudzysłowami, nie sądzę, że to robi różnicę.
Dominique
0

Jeśli używasz gnu grep, to ma flagę, która robi dokładnie to, co chcesz:

grep -irn --include=\*.h "string" path

chociaż nie sądzę, że jest dostępny w innych greps.

plnu
źródło