Det kanske låter som att jag frågar samma sak som den här frågan , men Jag har olika krav. Detta är ett exempel på mitt filsystem:
- / code /
- internal /
- dev /
- main /
- public /
- dev /
- main /
- release /
- verktyg /
- internal /
/code/internal/dev/
, /code/public/dev/
och /code/tools/
innehåller underkataloger för flera projekt. Jag arbetar nästan uteslutande i dev-grenarna av /code/internal/
och /code/public/
, och ofta vill jag söka efter en textsträng i dessa kataloger tillsammans med /code/tools/
(som inte har några grenar). I dessa fall måste jag göra tre separata kommandon:
$ grep -r "some string" /code/internal/dev/ $ grep -r "some string" /code/public/dev/ $ grep -r "some string" /code/tools/
Jag skulle vilja veta om det finns ett enda kommando för att göra detta. Om inte, skulle jag troligtvis behöva skriva en enkelt bash-skript.
A nswer
Du kan sammanfoga flera sökvägar för grep att leta efter:
grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
Kommentarer
Svar
Om du vill utnyttja jokertecken maximalt (och hierarkin du har lagt upp är klar) kan du göra
grep -r "some string" /code/{*/dev,tools}/*.cs
Förklaring:
Det första steget är utvidgningen av avstängd lista. foo{bar,baz}qux
expanderar till foobarqux foobazqux
. Det vill säga det genereras ett separat ord för varje kommaseparerat objekt i listan, med prefixet och postfixdelen fäst till var och en. Du kan se hur det fungerar genom att göra
echo A{1,2,3,4}B
som matar ut
A1B A2B A3B A4B
Observera att detta också fungerar med flera hakparenteser och även med tomma argument, till exempel
echo {,1,2}{0,1,2}:{2,3}
ger
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-expansion ser ditt kommando ut så här:
grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs
Nästa steg är jokerteckenutvidgning. Det vet du redan för *.cs
-delen, men det fungerar också för mellanliggande kataloger. om en /
följer, matchas bara kataloger. Därför med tanke på din hierarki (och skapa filnamn för .cs
-filerna), du ” Kommer att få kommandot:
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 allt detta har hänt kallas grep
med den här listan över arg uments (notera att detsamma händer med dina ursprungliga kommandon; grep
får aldrig se *
; expandera som görs helt av bash
innan du ringer till grep
).
grep: /code/internal/dev/*.cs: No such file or directory
om jag inte tar bort*.cs
från kommandot. Det här är mitt fel eftersom jag ursprungligen satte*.cs
i min fråga.