Możesz także użyć globstar.
Budowanie grep
poleceń za pomocą find
, jak w odpowiedzi Zanny , jest bardzo solidnym, wszechstronnym i przenośnym sposobem na to (patrz także odpowiedź Sudodusa ). A muru opublikowało doskonałe podejście do korzystania grep
z --include
opcji . Ale jeśli chcesz użyć tylko grep
polecenia i powłoki, możesz to zrobić na inny sposób - możesz sprawić, że sama powłoka wykona niezbędną rekursję :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
Te -H
marki flag grep
wyświetlić nazwę pliku, nawet jeśli tylko jeden pasujący plik zostanie znaleziony. Można przekazać -a
, -i
oraz -n
flagi (z twojego przykładzie) grep
, a także, jeśli to, co trzeba. Ale nie zaliczaj -r
lub -R
podczas korzystania z tej metody. Jest to powłoka, która powraca do katalogów w rozszerzaniu wzorca globu zawierającego **
, a niegrep
.
Te instrukcje są specyficzne dla powłoki Bash. Bash jest domyślną powłoką użytkownika w Ubuntu (i większości innych systemów operacyjnych GNU / Linux), więc jeśli korzystasz z Ubuntu i nie wiesz, co to jest twoja powłoka, to prawie na pewno Bash. Chociaż popularne powłoki zwykle obsługują **
globusy przeszukujące katalogi , nie zawsze działają w ten sam sposób. Aby uzyskać więcej informacji, zobacz Stéphane Chazelas „s doskonałą odpowiedź do wyniku ls * ls ls ** i *** na Unix.SE .
Jak to działa
Włączenie opcji powłoki bash globstar powoduje, że ścieżki dopasowania zawierające separator katalogów ( ). Jest to zatem glob rekursujący katalogi. W szczególności, jak wyjaśniono:**
/
man bash
Gdy opcja powłoki globstar jest włączona, a * jest używany w kontekście rozszerzenia nazwy ścieżki, dwa sąsiednie * użyte jako pojedynczy wzorzec będą pasować do wszystkich plików oraz zero lub więcej katalogów i podkatalogów. Jeśli po nich następuje znak /, dwa sąsiadujące * s będą pasować tylko do katalogów i podkatalogów.
Powinieneś być z tym ostrożny, ponieważ możesz uruchamiać polecenia, które modyfikują lub usuwają znacznie więcej plików, niż masz zamiar, zwłaszcza jeśli piszesz, **
gdy masz zamiar pisać *
. (Jest to bezpieczne w tym poleceniu, które nie zmienia żadnych plików.) shopt -u globstar
Wyłącza opcję powłoki globstar.
Istnieje kilka praktycznych różnic między globstar a find
.
find
jest znacznie bardziej wszechstronny niż globstar. Wszystko, co możesz zrobić z globstar, możesz zrobić również z find
poleceniem. Lubię globstar i czasami jest to wygodniejsze, ale globstar nie jest ogólną alternatywą dla find
.
Powyższa metoda nie sprawdza katalogów, których nazwy zaczynają się od .
. Czasami nie chcesz rekursować takich folderów, ale czasem tak.
Podobnie jak w przypadku zwykłego globu, powłoka buduje listę wszystkich pasujących ścieżek i przekazuje je jako argumenty do polecenia ( grep
) zamiast samego globu. Jeśli masz tak wiele plików o nazwie, file.txt
że wynikowe polecenie byłoby zbyt długie, aby system mógł je wykonać, wówczas powyższa metoda zawiedzie. W praktyce potrzebujesz (przynajmniej) tysięcy takich plików, ale może się zdarzyć.
Stosowane metody find
nie podlegają tym ograniczeniom, ponieważ:
Sposób Zanny buduje i uruchamia grep
polecenie z potencjalnie wieloma argumentami ścieżki. Ale jeśli znaleziono więcej plików, niż można je wyświetlić w jednej ścieżce, akcja +
-terminated -exec
uruchamia polecenie z niektórymi ścieżkami, a następnie uruchamia je ponownie z kilkoma ścieżkami i tak dalej. W przypadku grep
wprowadzania ciągu w wielu plikach powoduje to prawidłowe zachowanie.
Podobnie jak opisana tutaj metoda globstar, drukuje ona wszystkie pasujące linie, z dołączonymi do nich ścieżkami.
Droga sudodusa przebiega grep
osobno dla każdego file.txt
znalezionego. Jeśli jest wiele plików, może być wolniejsze niż niektóre inne metody, ale działa.
Ta metoda wyszukuje pliki i drukuje ich ścieżki, a następnie pasujące linie, jeśli takie istnieją. Jest to inny format wyjściowy niż format utworzony przez moją metodę Zanna i Muru .
Uzyskiwanie koloru find
Jedną z bezpośrednich korzyści płynących z używania globstar jest to, że domyślnie na Ubuntu grep
produkuje kolorowe wydruki. Ale można łatwo dostać się z tym find
też .
Konta użytkowników w Ubuntu są tworzone za pomocą aliasu, który sprawia, że grep
naprawdę działa grep --color=auto
(uruchom, alias grep
aby zobaczyć). To dobrze, że aliasy są dość dużo tylko rozszerzać, gdy wydasz je interaktywnie , ale oznacza to, że jeśli chcesz find
, aby wywołać grep
z --color
flagą, musisz napisać to wyraźnie. Na przykład:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +