Det kan høres ut som om jeg spør det samme som dette spørsmålet , men Jeg har forskjellige krav. Dette er et eksempel på filsystemet mitt:

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • verktøy /

/code/internal/dev/, /code/public/dev/ og /code/tools/ inneholder underkataloger for flere prosjekter. Jeg jobber nesten utelukkende i dev-grenene til /code/internal/ og /code/public/, og ofte vil jeg søke etter en tekststreng i disse katalogene sammen med /code/tools/ (som ikke har noen grener). I disse tilfellene må jeg gjø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 gjerne vite om det er en enkelt kommando for å gjøre dette. Hvis ikke, vil jeg mest sannsynlig trenge å skrive en enkelt bash-skript.

A nswer

Du kan sammenkoble flere baner for grep å se etter:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/ 

Kommentarer

  • Dette er så opplagt. Hvorfor tenkte jeg ikke ' ?!
  • Egentlig kaster dette en feil grep: /code/internal/dev/*.cs: No such file or directory med mindre jeg fjerner *.cs fra kommandoen. Dette er min feil fordi jeg opprettet *.cs i spørsmålet mitt.

Svar

Hvis du vil utnytte jokertegn maksimalt (og hierarkiet du har lagt ut er komplett), kan du gjøre

grep -r "some string" /code/{*/dev,tools}/*.cs 

Forklaring:

Det første trinnet er utvidelse av avstivet liste. foo{bar,baz}qux utvides til foobarqux foobazqux. Det vil si at det genereres et eget ord for hvert komma-atskilt element i listen, med prefikset og postfiks-delen knyttet til hvert. Du kan se hvordan det fungerer ved å gjøre

echo A{1,2,3,4}B 

hvilke utganger

A1B A2B A3B A4B 

Merk at dette også fungerer med flere parenteser, og også med tomme argumenter; for eksempel

echo {,1,2}{0,1,2}:{2,3} 

gir

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å etter brace-utvidelse ser kommandoen din slik ut:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs 

Det neste trinnet er utvidelse av jokertegn. Det vet du allerede for *.cs -delen, men det fungerer også for mellomliggende kataloger; dessuten hvis en / følger, er det bare kataloger som samsvarer. Derfor, gitt hierarkiet ditt (og du lager filnavn for .cs -filene), du » 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 etter at alt dette har skjedd, blir grep kalt med denne listen over arg uments (merk at det samme skjer med de opprinnelige kommandoene dine; grep får aldri se *; utvide det som gjøres fullstendig av bash før du ringer til grep).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *