Może się wydawać, że pytam o to samo co to pytanie , ale Mam inne wymagania. Oto przykład mojego systemu plików:

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • narzędzia /

/code/internal/dev/, /code/public/dev/ i /code/tools/ zawierają podkatalogi dla wielu projektów. Pracuję prawie wyłącznie w gałęziach dev /code/internal/ i /code/public/ i często chcę wyszukać ciąg tekstowy w tych katalogach wraz z /code/tools/ (który nie ma gałęzi). W takich przypadkach muszę zrobić trzy oddzielne polecenia:

$ grep -r "some string" /code/internal/dev/ $ grep -r "some string" /code/public/dev/ $ grep -r "some string" /code/tools/ 

Chciałbym wiedzieć, czy jest do tego jedno polecenie. Jeśli nie, najprawdopodobniej będę musiał napisać prosty skrypt bash.

A nswer

Możesz połączyć kilka ścieżek, które ma szukać grep:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/ 

Komentarze

  • To takie oczywiste. Dlaczego nie ' t pomyślałem o tym ?!
  • W rzeczywistości powoduje to błąd grep: /code/internal/dev/*.cs: No such file or directory, chyba że usunę *.cs z polecenia. To moja wina, ponieważ pierwotnie umieściłem *.cs w moim pytaniu.

Odpowiedź

Jeśli chcesz maksymalnie wykorzystać symbole wieloznaczne (a opublikowana hierarchia jest kompletna), możesz zrobić

grep -r "some string" /code/{*/dev,tools}/*.cs 

Wyjaśnienie:

Pierwszym wykonanym krokiem jest rozszerzenie listy stężeń. foo{bar,baz}qux rozwija się do foobarqux foobazqux. Oznacza to, że dla każdego elementu na liście rozdzielanego przecinkami generowane jest oddzielne słowo, z dołączonymi prefiksami i postfiksami. Możesz zobaczyć, jak to działa, wykonując

echo A{1,2,3,4}B 

które generuje

A1B A2B A3B A4B 

Zauważ, że działa to również z wieloma nawiasami klamrowymi, a także z pustymi argumentami, na przykład

echo {,1,2}{0,1,2}:{2,3} 

daje

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3 

Więc po rozwinięciu nawiasów, polecenie wygląda następująco:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs 

Następnym krokiem jest rozwinięcie za pomocą symboli wieloznacznych. Wiesz już, że w przypadku części *.cs, ale działa to również w przypadku katalogów pośrednich; ponadto jeśli następuje /, dopasowywane są tylko katalogi. Dlatego biorąc pod uwagę twoją hierarchię (i tworzące nazwy plików dla plików .cs), „ Otrzymam polecenie:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs 

Dopiero po tym wszystkim grep jest wywoływane z tą listą argumentów uments (zwróć uwagę, że to samo dzieje się z oryginalnymi poleceniami; grep nigdy nie widzi *; rozwijanie, które jest całkowicie wykonywane przez bash przed wywołaniem grep).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *