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 /
- internal /
/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
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.
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.