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 /
- internal /
/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
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
).
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.