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 /

/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

  • Dette er så indlysende. Hvorfor tænkte jeg ikke ' ?!
  • Faktisk kaster dette en fejl 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.

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *