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 /

/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

  • Detta är så uppenbart. Varför tänkte jag inte ' ?!
  • Egentligen ger detta ett fel 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.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *