Úgy hangozhat, mintha ugyanazt kérdezném, mint ezt a kérdést , de Különböző követelményeim vannak. Ez egy példa a fájlrendszeremre:

  • / code /
    • belső /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • eszközök /

/code/internal/dev/, /code/public/dev/ és /code/tools/ több projekt alkönyvtárát tartalmazzák. Szinte kizárólag a /code/internal/ és a /code/public/, és gyakran szeretnék keresni egy szöveges karakterláncot ezekben a könyvtárakban a /code/tools/ mellett (amelyeknek nincsenek elágazásai). Ezekben az esetekben meg kell tennem három különálló parancs:

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

Szeretném tudni, hogy van-e egyetlen parancs erre. Ha nem, akkor valószínűleg egy egyszerű bash szkript.

A nswer

A grep számára a kereséshez több utat is összefűzhet:

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

Megjegyzések

  • Ez annyira nyilvánvaló. Miért nem gondoltam erre ' t ?!
  • Valójában ez hibát dob grep: /code/internal/dev/*.cs: No such file or directory, hacsak nem távolítom el a *.cs a parancsból. Ez az én hibám, mert a *.cs -t eredetileg a kérdésembe tettem.

Válasz

Ha maximálisan ki akarja használni a helyettesítő karaktereket (és az általad közzétett hierarchia teljes), akkor ezt megteheti

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

Magyarázat: / h1>

Az első lépés a merevített lista bővítése. A foo{bar,baz}qux kibővül foobarqux foobazqux értékre. Vagyis a listán minden vesszővel elválasztott elemhez külön szó generálódik, mindegyikhez csatolva az előtagot és az utótagot. Megtekintheti ennek működését azáltal, hogy ezt csinálja / div>

amely kimeneti

A1B A2B A3B A4B 

Ne feledje, hogy ez több zárójel mellett üres argumentumokkal is működik; például

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

ad

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 

Tehát a zárójel kiterjesztése után a parancsod így néz ki:

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

A következő lépés a helyettesítő karakterek bővítése. Ezt már tudja, hogy a *.cs résznél, de a köztes könyvtáraknál is működik; ha egy / következik, akkor csak a könyvtárak kerülnek egyezésre. Ezért a hierarchiájára tekintettel (és a .cs fájlok fájlneveinek összeállítására) tekintettel Ön ” Megkapom a parancsot:

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 

Csak miután mindez megtörtént, grep meghívásra kerül az arg listájával eszközök (vegye figyelembe, hogy ugyanez történik az eredeti parancsokkal is; grep soha nem látja a *; kibővítése, amelyet teljesen végrehajt bash, mielőtt felhívná a grep).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük