Het klinkt misschien alsof ik “hetzelfde stel als deze vraag , maar Ik heb verschillende vereisten. Dit is een voorbeeld van mijn bestandssysteem:

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • tools /

/code/internal/dev/, /code/public/dev/ en /code/tools/ bevatten submappen voor meerdere projecten. Ik werk bijna uitsluitend in de dev-branches van /code/internal/ en /code/public/, en vaak wil ik zoeken naar een tekstreeks in die mappen samen met /code/tools/ (die geen vertakkingen heeft). In deze gevallen moet ik doen drie afzonderlijke commandos:

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

Ik “zou graag willen weten of er een enkel commando is om dit te doen. Zo niet, dan zou ik hoogstwaarschijnlijk een eenvoudig bash-script.

A nswer

Je kunt verschillende paden samenvoegen waar grep naar kan zoeken:

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

Reacties

  • Dit is zo duidelijk. Waarom denk ik hier niet aan ' ?!
  • Dit genereert eigenlijk een fout grep: /code/internal/dev/*.cs: No such file or directory tenzij ik de *.cs van het commando. Dit is mijn fout omdat ik de *.cs oorspronkelijk in mijn vraag heb gezet.

Antwoord

Als je maximaal gebruik wilt maken van jokertekens (en de hiërarchie die je hebt geplaatst is compleet), kun je dat doen

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

Uitleg:

De eerste stap is het uitbreiden van de lijst met schoren. foo{bar,baz}qux wordt uitgebreid naar foobarqux foobazqux. Dat wil zeggen, er wordt “een apart woord gegenereerd voor elk door kommas gescheiden item in de lijst, met het voorvoegsel en het postfixgedeelte aan elk toegevoegd. U kunt zien hoe dat werkt door

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

welke output

A1B A2B A3B A4B 

Merk op dat dit ook werkt met meerdere accolades, en ook met lege argumenten; bijvoorbeeld

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

geeft

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 

Dus na accolade-uitbreiding ziet je commando er als volgt uit:

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

De volgende stap is wildcard-uitbreiding. Dat weet je al voor het *.cs -gedeelte, maar het werkt ook voor tussenliggende mappen; bovendien als een / volgt, komen alleen mappen overeen. Gezien uw hiërarchie (en het maken van bestandsnamen voor de .cs bestanden), ” Ik krijg het commando:

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 

Pas nadat dit allemaal is gebeurd, wordt grep aangeroepen met deze lijst met arg uments (merk op dat hetzelfde gebeurt met uw originele commandos; grep krijgt nooit de * te zien; uitbreiden wordt volledig gedaan door bash voordat grep) wordt aangeroepen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *