Grep'i birden fazla dürüst olmayan dizini aramak için nasıl kullanabilirim?


21

Ben aynı şeyi soruyorum gibi gelebilir bu soruya ama farklı gereksinimleri vardır. Bu benim dosya sistemime bir örnek:

  • / Kod /
    • iç/
      • dev /
      • ana/
    • halka açık/
      • dev /
      • ana/
      • serbest bırakmak/
    • araçlar/

/code/internal/dev/, /code/public/dev/Ve /code/tools/çoklu projeler için alt dizinleri içerir. Ben dev dallarında neredeyse sadece çalışmak /code/internal/ve /code/public/ve sık sık ben birlikte o dizinlerde bir metin dizesi aramak istiyorsanız /code/tools/(hayır şubesi vardır). Bu durumlarda üç ayrı komut yapmak zorundayım:

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

Bunu yapmak için tek bir komut olup olmadığını bilmek istiyorum. Değilse, büyük olasılıkla basit bir bash betiği yazmam gerekir.

Yanıtlar:


38

Grep'in arayabileceği birkaç yolu birleştirebilirsiniz:

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

Bu çok açık. Bunu neden düşünmedim ?!
David Kennedy

Aslında, komuttan grep: /code/internal/dev/*.cs: No such file or directorykaldırmazsam bu bir hata atar *.cs. Bu benim hatam çünkü *.csilk başta soruma koydum .
David Kennedy

14

Joker karakterlerden en üst düzeyde yararlanmak istiyorsanız (ve gönderdiğiniz hiyerarşi tamamlanmışsa),

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

Açıklama:

İlk adım hazır listenin genişletilmesidir. foo{bar,baz}quxgenişler foobarqux foobazqux. Diğer bir deyişle, listedeki virgülle ayrılmış her öğe için, önek ve postfix kısmı her birine eklenmiş ayrı bir kelime oluşturulur. Bunun nasıl çalıştığını görebilirsiniz

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

hangi çıktılar

A1B A2B A3B A4B

Bunun birden çok ayraçla ve boş argümanlarla da çalıştığını unutmayın; Örneğin

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

verir

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

Brace genişletmesinden sonra, komutunuz şöyle görünür:

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

Bir sonraki adım joker karakter genişletmesidir. Bunu zaten biliyorsunuz *.cs, ama aynı zamanda ara dizinler için de çalışıyor; ayrıca, eğer /takip edilirse , sadece dizinler eşleştirilir. Bu nedenle, hiyerarşiniz (ve .csdosyalar için dosya adlarını oluşturarak) verildiğinde , komutu alırsınız:

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

Ancak tüm bunlar gerçekleştikten sonra, grepbu argüman listesi ile çağrılır (orijinal komutlarınızda da aynı şey olduğunu unutmayın; grepasla görmeden önce *; genişlemeden bashönce yapılan genişleme grep).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.