Může to znít, jako bych kladl totéž jako tuto otázku , ale Mám různé požadavky. Toto je příklad mého souborového systému:

  • / code /
    • interní /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • tools /

/code/internal/dev/, /code/public/dev/ a /code/tools/ obsahují podadresáře pro více projektů. Pracuji téměř výhradně v dev pobočkách /code/internal/ a /code/public/ a často chci v těchto adresářích vyhledat textový řetězec spolu s /code/tools/ (který nemá žádné větve). V těchto případech musím udělat tři samostatné příkazy:

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

Chtěl bych vědět, jestli existuje jediný příkaz, jak to udělat. Pokud ne, nejspíš bych musel napsat jednoduchý bash skript.

A nswer

Chcete-li hledat grep, můžete zřetězit několik cest:

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

Komentáře

  • Je to tak zřejmé. Proč na to nemyslím ' t ?!
  • Ve skutečnosti to způsobí chybu grep: /code/internal/dev/*.cs: No such file or directory, pokud neodstraním *.cs z příkazu. To je moje chyba, protože jsem do své otázky původně vložil *.cs.

Odpovědět

Pokud chcete maximálně využívat zástupné znaky (a vámi zveřejněná hierarchie je úplná), můžete tak učinit

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

Vysvětlení:

Prvním krokem je rozšíření seznamu připravených položek. foo{bar,baz}qux expanduje do foobarqux foobazqux. To znamená, že pro každou položku oddělenou čárkou v seznamu je vygenerováno samostatné slovo, ke kterému je připojena část s předponou a postfixem. Jak to funguje, uvidíte tak, že

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

které výstupy

A1B A2B A3B A4B 

Všimněte si, že to funguje také s více složenými závorkami a také s prázdnými argumenty; například

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

dává

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 

Takže po rozšíření složené závorky vypadá váš příkaz takto:

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

Dalším krokem je rozšíření zástupných znaků. Již víte, že pro část *.cs to ale funguje i pro mezilehlé adresáře; navíc pokud následuje /, budou spárovány pouze adresáře. Proto vzhledem k vaší hierarchii (a vytváření názvů souborů pro .cs) můžete Získám příkaz:

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 

Teprve poté, co k tomu dojde, je volán grep s tímto seznamem arg poznámky (to samé se děje s vašimi původními příkazy; grep nikdy neuvidí *; jeho rozšíření je zcela provedeno bash před voláním grep).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *