Możesz także użyć globstar.
Budowanie greppoleceń 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 grepz --includeopcji . Ale jeśli chcesz użyć tylko greppolecenia 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 -Hmarki flag grepwyświetlić nazwę pliku, nawet jeśli tylko jeden pasujący plik zostanie znaleziony. Można przekazać -a, -ioraz -nflagi (z twojego przykładzie) grep, a także, jeśli to, co trzeba. Ale nie zaliczaj -rlub -Rpodczas 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 globstarWyłącza opcję powłoki globstar.
Istnieje kilka praktycznych różnic między globstar a find.
findjest znacznie bardziej wszechstronny niż globstar. Wszystko, co możesz zrobić z globstar, możesz zrobić również z findpoleceniem. 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 findnie podlegają tym ograniczeniom, ponieważ:
Sposób Zanny buduje i uruchamia greppolecenie 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 -execuruchamia polecenie z niektórymi ścieżkami, a następnie uruchamia je ponownie z kilkoma ścieżkami i tak dalej. W przypadku grepwprowadzania 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 greposobno dla każdego file.txtznalezionego. 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 grepprodukuje kolorowe wydruki. Ale można łatwo dostać się z tym findteż .
Konta użytkowników w Ubuntu są tworzone za pomocą aliasu, który sprawia, że grepnaprawdę działa grep --color=auto(uruchom, alias grepaby 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ć grepz --colorflagą, musisz napisać to wyraźnie. Na przykład:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +