Może to brzmieć tak, jakbym zadawał to samo pytanie , ale mam inne wymagania. To jest przykład mojego systemu plików:
- /kod/
- wewnętrzny/
- dev /
- Główny/
- publiczny/
- dev /
- Główny/
- wydanie/
- przybory/
- wewnętrzny/
/code/internal/dev/
, /code/public/dev/
I /code/tools/
zawierać podkatalogi dla wielu projektów. Pracuję prawie wyłącznie w gałęziach programistów /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ę wykonać trzy osobne 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 na to jedno polecenie. Jeśli nie, najprawdopodobniej musiałbym napisać prosty skrypt bash.
grep: /code/internal/dev/*.cs: No such file or directory
chyba że usunę*.cs
polecenie z polecenia. To moja wina, ponieważ*.cs
pierwotnie postawiłem pytanie.Jeśli chcesz maksymalnie wykorzystać symbole wieloznaczne (a opublikowana hierarchia jest kompletna), możesz to zrobić
Wyjaśnienie:
Pierwszym wykonanym krokiem jest rozszerzenie listy stężeń.
foo{bar,baz}qux
rozwija się dofoobarqux foobazqux
. Oznacza to, że dla każdej pozycji na liście jest generowane osobne słowo, z dołączoną częścią przedrostek i postfiks. Możesz zobaczyć, jak to działa, robiącktóre wyjścia
Zauważ, że działa to również z wieloma nawiasami klamrowymi, a także z pustymi argumentami; na przykład
daje
Więc po rozwinięciu nawiasu twoje polecenie wygląda następująco:
Następnym krokiem jest rozwinięcie symboli wieloznacznych. Wiesz już o tym
*.cs
, ale działa również w przypadku katalogów pośrednich; ponadto, jeśli/
następuje, pasują tylko katalogi. Dlatego biorąc pod uwagę twoją hierarchię (i tworzenie nazw.cs
plików), otrzymasz polecenie:Dopiero po tym, jak
grep
to wszystko się stanie, jest wywoływany z tą listą argumentów (zauważ, że to samo dzieje się z twoimi oryginalnymi poleceniami;grep
nigdy nie widzi*
; rozwijanie odbywa się całkowiciebash
przed wywołaniemgrep
).źródło