Użycie grep z flagą --exclude-dir w celu wykluczenia wielu katalogów

16

Przeszukuję aplikację Ruby on Rails dla słowa grepużywanego w OSX i chciałbym wykluczyć katalogi pasujące do określonego wzorca.

Używam następującego polecenia:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

To polecenie nie działa tak, jak myślałem. Oto, jak myślałem, że to zadziała:

  • i - wyszukiwanie bez rozróżniania wielkości liter
  • n - wydrukuj numer linii, w której znaleziono wzór
  • R - szukaj rekurencyjnie
  • w - Chcę tylko całe słowa - tzn. dopasuj „bezpośredni”, ale nie „katalog”
  • -E - użyj rozszerzonego wyrażenia regularnego
  • „direct” - wyrażenie regularne, które chcę dopasować
  • . - szukaj w bieżącym katalogu
  • --exclude-dir -E 'git | log | asset' - wyklucz katalogi, które pasują do git lub logu lub zasobu.

Jeśli chodzi o katalogi wykluczeń, polecenie nadal kończy wyszukiwanie w katalogach „./git” i „./log” , a także w „./app/assets”

Oczywiście brakuje mi podstawowej wiedzy, ale nie wiem, co to jest.

Steven L.
źródło

Odpowiedzi:

16

Opis strony podręcznika dla tej opcji jest trochę mylący ... To wzór jak w globach, a nie wzór jak w wyrażeniach regularnych . Na infostronie :

--exclude-dir = GLOB

Pomiń katalog wiersza poleceń z sufiksem nazwy zgodnym ze wzorcem GLOB. Podczas wyszukiwania rekurencyjnego pomiń dowolny podkatalog, którego podstawowa nazwa pasuje do GLOB. Zignoruj ​​zbędne ukośniki końcowe w GLOB.

W twoim przypadku możesz uruchomić:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

wykluczyć katalogi o nazwach git, logi assetsczy np

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

aby wykluczyć nazwy katalogów kończące się na gitlub zaczynające się na asset.

don_crissti
źródło
Bardzo interesujące. Chyba powinienem sprawdzić, czym jest glob.
Steven L.,
Przykro mi, ale żadne z nich nie działa. Czy pomógłbym, gdybym powiedział, że używam tej wersji grep: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.,
Jestem zszokowany, ponieważ czytam instrukcję bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) i nie ma wzmianki o --exclude-dir. Gwizd.
Steven L.,
2
OK - teraz widzę problem. Musi to być zmodyfikowana wersja grep używana tylko przez system Apple. Korzystam z systemu Mac OS X. Przepraszam za zamieszanie. Jestem pewien, że istnieje gdzieś forum na stackexchange, na którym mogę pisać.
Steven L.
@ user245185 korzystasz z BSD lub OSX? Oba są tutaj na temat, ale proszę edytować swoje pytanie i powiedz nam, jakiego systemu operacyjnego używasz. Zachowania standardowych narzędzi różnią się między implementacjami w miarę odkrywania.
terdon
8

--exclude-dirnie rozumie |.

Możesz jednak uzyskać ten sam efekt, określając --exclude-dirwiele razy, po jednym dla każdego katalogu, który chcesz wykluczyć:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
John1024
źródło
To zadziałało dla mnie. Chciałem wykluczyć katalog domowy, ale nie działało to z innymi opcjami, takimi jak --exclude-dir={home}. Pracowałem, kiedy pisałem--exclude-dir 'home'
Mubin Icyer