Kiedy chcę przeprowadzić rekurencyjne wyszukiwanie grep w bieżącym katalogu, zwykle robię:
grep -ir "string" .
Ale to polecenie przeszukuje wszystkie rodzaje plików, w tym pliki binarne (obrazy, audio, wideo itp.), Co powoduje bardzo powolny proces wyszukiwania.
Jeśli to zrobię, na przykład nie zadziała:
grep -ir "string" *.php
Nie działa, ponieważ w bieżącym katalogu nie ma plików PHP, ale w niektórych podkatalogach w bieżącym katalogu, a nazwy podkatalogów nie kończą się na „.php”, więc grep nie zagląda do nich.
Jak więc mogę przeprowadzić wyszukiwanie rekurencyjne z bieżącego katalogu, ale także podać symbole wieloznaczne nazw plików? (tzn .: szukaj tylko w plikach, które kończą się określonym rozszerzeniem)
grep -ir "string" --include="*.php" *
Jeśli masz wersję,
grep
której brakuje tej--include
opcji, możesz użyć następujących opcji. Oba zostały przetestowane na takiej strukturze katalogów:Gdzie wszystkie
.php
pliki zawierają ciągstring
.Posługiwać się
find
Wyjaśnienie
To znajdzie wszystkie
.php
pliki, a następnie uruchomi sięgrep -H string
na każdym z nich. Zfind
„s-exec
opcji{}
otrzymuje każda ze znalezionych plików.-H
Mówigrep
wydrukować nazwę pliku, a także dopasowaną linię.Zakładając, że masz wystarczająco nową wersję
bash
, użyjglobstar
:Wyjaśnienie
Jak wyjaśniono w podręczniku bash :
Tak więc, uruchamiając
shopt -s globstar
, aktywujesz funkcję iglobstar
opcję Bash, która powoduje**/*php
rozwinięcie do wszystkich.php
plików w bieżącym katalogu (**
dopasowuje 0 lub więcej katalogów, więc**/*php
pasuje./foo.php
również), które są następnie wyszukiwanestring
.źródło
Posługiwać się
*/*.php
To sprawia, że wyszukiwanie grep jest o jeden poziom podkatalogu
źródło