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 /

/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

  • Tämä on niin ilmeistä. Miksi en ' t ajattele tätä ?!
  • Tämä heittää virheen 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.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *