Det lyder måske som om jeg spørger det samme som dette spørgsmål , men Jeg har forskellige krav. Dette er et eksempel på mit filsystem:
- / code /
- internal /
- dev /
- main /
- public /
- dev /
- main /
- release /
- værktøjer /
- internal /
/code/internal/dev/
, /code/public/dev/
og /code/tools/
indeholder underkataloger til flere projekter. Jeg arbejder næsten udelukkende i dev-grene af /code/internal/
og /code/public/
, og ofte vil jeg søge efter en tekststreng i disse mapper sammen med /code/tools/
(som ikke har nogen grene). I disse tilfælde skal jeg gøre tre separate kommandoer:
$ grep -r "some string" /code/internal/dev/ $ grep -r "some string" /code/public/dev/ $ grep -r "some string" /code/tools/
Jeg vil gerne vide, om der er en enkelt kommando til at gøre dette. Hvis ikke, ville jeg sandsynligvis have brug for at skrive en simpelt bash-script.
A. nswer
Du kan sammenkæde flere stier, så grep kan søges:
grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
Kommentarer
Svar
Hvis du vil gøre maksimal brug af jokertegn (og det hierarki, du har sendt, er komplet), kan du gøre
grep -r "some string" /code/{*/dev,tools}/*.cs
Forklaring:
Det første trin, der er udført, er udvidelse af afstivet liste. foo{bar,baz}qux
udvides til foobarqux foobazqux
. Det vil sige, at der er genereret et separat ord for hvert komma-adskilt element på listen med præfikset og postfix-delen knyttet til hver. Du kan se, hvordan det fungerer ved at gøre
echo A{1,2,3,4}B
hvilke output
A1B A2B A3B A4B
Bemærk, at dette også fungerer med flere parenteser og også med tomme argumenter, for eksempel
echo {,1,2}{0,1,2}:{2,3}
giver
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
Så efter brace-udvidelse ser din kommando sådan ud:
grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs
Det næste trin er wildcard-udvidelse. Det ved du allerede til *.cs
-delen, men det fungerer også for mellemliggende mapper; desuden hvis en /
følger, matches kun mapper. Derfor er dit hierarki (og der oprettes filnavne til .cs
filer), du ” Jeg får kommandoen:
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
Først når alt dette er sket, kaldes grep
med denne liste over arg uments (bemærk, at det samme sker med dine originale kommandoer; grep
får aldrig se *
; udvidelse sker fuldstændigt ved bash
inden du ringer til grep
).
grep: /code/internal/dev/*.cs: No such file or directory
medmindre jeg fjerner*.cs
fra kommandoen. Dette er min skyld, fordi jeg oprindeligt satte*.cs
i mit spørgsmål.