Saattaa kuulostaa siltä, että kysyn samaa kuin tämä kysymys , mutta Minulla on erilaiset vaatimukset. Tämä on esimerkki tiedostojärjestelmästäni:
- / code /
- sisäinen /
- dev /
- main /
- public /
- dev /
- main /
- release /
- työkalut /
- sisäinen /
/code/internal/dev/
, /code/public/dev/
ja /code/tools/
sisältävät alihakemistoja useille projekteille. Työskentelen melkein yksinomaan /code/internal/
ja /code/public/
, ja usein haluan etsiä tekstimerkkijonoa näistä hakemistoista /code/tools/
: n kanssa (jolla ei ole haaroja). Näissä tapauksissa minun on tehtävä kolme erillistä komentoa:
$ grep -r "some string" /code/internal/dev/ $ grep -r "some string" /code/public/dev/ $ grep -r "some string" /code/tools/
Haluaisin tietää, onko tätä varten yksi komento. Jos ei, minun on todennäköisesti kirjoitettava yksinkertainen bash-komentosarja.
A nswer
Voit yhdistää useita polkuja etsimään grep:
grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
Kommentit
Vastaa
Jos haluat käyttää jokerimerkkejä mahdollisimman hyvin (ja lähettämäsi hierarkia on valmis), voit tehdä sen
grep -r "some string" /code/{*/dev,tools}/*.cs
Selitys:
Ensimmäinen askel on joustoluettelon laajentaminen. foo{bar,baz}qux
laajenee muotoon foobarqux foobazqux
. Eli luettelossa on jokaiselle pilkulla erotetulle kohteelle erillinen sana, johon on liitetty etuliite- ja jälkiliiteosa. Voit nähdä, miten se toimii tekemällä
echo A{1,2,3,4}B
joka tuottaa
A1B A2B A3B A4B
Huomaa, että tämä toimii myös useilla aaltosulkeilla ja myös tyhjillä argumenteilla; esimerkiksi
echo {,1,2}{0,1,2}:{2,3}
antaa
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
Joten aaltosulkeen laajentamisen jälkeen komentosi näyttää tältä:
grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs
Seuraava vaihe on jokerimerkkilaajennus. Tiedät sen jo *.cs
-osiossa, mutta se toimii myös välihakemistoissa; jos /
seuraa, vain hakemistot täsmäävät. Siksi hierarkian (ja .cs
-tiedostojen nimien muodostamisen) vuoksi sinä ” Hankin komennon:
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
Vasta tämän jälkeen kaikki grep
kutsutaan tällä argenttiluettelolla instrumentit (huomaa, että sama tapahtuu alkuperäisten komentojesi kanssa; grep
ei koskaan näe *
; laajentaminen, jonka bash
suorittaa kokonaan, ennen kuin soitat grep
).
grep: /code/internal/dev/*.cs: No such file or directory
, ellet poista*.cs
komennosta. Tämä on minun vikani, koska laitoin*.cs
kysymykseeni alun perin.