grep, ancak yalnızca belirli dosya uzantıları


966

grepBazı dizinlere bazı komut dosyaları yazmaya çalışıyorum , ancak bu dizinler her türlü dosya türünü içeriyor.

Ben istiyorum grepsadece .hve .cppşimdilik ancak gelecekte belki birkaç diğerleri.

Şimdiye kadar var:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP email@domain.com

Birisi bana şimdi sadece belirli dosya uzantılarını nasıl ekleyeceğimi gösterebilir mi?


13
Denediniz grep -r -i CP_Image ~/path1/*.{h,cpp}mi?

8
Kullanın Gümüş Searcher : ag -i CP_Image ~/path[1-5] | mailx -s GREP email@domain.com. İş bitmiş.
Johnsyweb


Egrep kullanın (büyük olasılıkla sisteminize önceden yüklenmiştir) ve daha sonra bir normal ifade kullanabilirsiniz.
Dogweather

8
Onlar eklendiğinde GNU adamlar gerçekten berbat -retmek grepo araları gibi dosyaları "bir şey yapmak ve bunu iyi" olduğunu araçlarını sahip UNIX mantra aramak zorunda. ÇOK bariz bir isme sahip dosyaları bulmak için mükemmel bir araç var.
Ed Morton

Yanıtlar:


1354

Sadece kullanmak --includeböyle parametreyi:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

istediğini yapmalı.

HoldOffHunger'in aşağıdaki cevabından açıklama almak için :

  • grep: komut

  • -r: tekrarlı

  • -i: yoksayma

  • --include \*.cpp: all * .cpp: C ++ dosyaları (dosya adlarında yıldız işareti olan bir dizininiz varsa \ ile kaçış)

  • ./: Geçerli dizinden başla.


123
Kayıt için: -r (özyinelemeli) -i (yoksay-durum) --include (yalnızca dosya modeliyle eşleşen dosyaları arayın)
Luis

34
Daha da optimize edilebilirgrep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
zwol

1
@ -R'nin sembolik bağlantılar için olduğu belgeler nerede?
titus

8
. Böyle possibilites geniş bir yelpazede ama grep -r --include = * txt 'searchterm' gerçekten cevap özünü açıklıyor ./ aşağıda verilen cevabı kapsar, çünkü bu örnek yüksek bir skor var gibi görünüyor
David Casper

10
neden ters eğik çizgi yerine çift tırnak kullanmıyorsunuz? örneğin:grep -r -i --include="*.h" --include="*.cpp" CP_Image
pambda

283

Bu yanıtların bazıları çok sözdizimi açısından ağır görünüyordu veya Debian Sunucumda sorunlar oluşturdular. Bu benim için mükemmel çalıştı:

PHP Devrimi: Nasıl Linux dosyaları Grep, ama sadece belirli dosya uzantıları?

Yani:

grep -r --include=\*.txt 'searchterm' ./

... veya büyük / küçük harfe duyarlı olmayan sürüm ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: komut

  • -r: tekrarlı

  • -i: yoksayma

  • --include: all * .txt: metin dosyaları (dosya adlarında yıldız işareti olan bir dizininiz varsa \ ile kaçış)

  • 'searchterm': Ne aranacak

  • ./: Geçerli dizinden başla.


7
Kaçmak gerektiğini *kullanarak \*.cppveya '*.cpp'. Aksi takdirde, çalışma dizini bazı *.txtdosyalar içerdiğinde beklenen sonucu vermez .
Melebius

@Melebius neden kaçmaya ihtiyaç duyduğunu açıklayabilir misiniz - bahsettiğiniz CPP veya TXT uzantılarıyla bir ilgisi var mı? Yoksa bunları örnek olarak mı kullandınız?
Simon East

2
@SimonEast Bu uzantılar bu soru ve cevapta kullanılanlardır, aksi halde özel bir şey değildir. Muhtemelen kullanmadan kaçmadan işe yarayacaktır, --include=<pattern>ancak aksi halde çok benzer hissettiren (yerine bir boşluk ) *ile kaçmak önemlidir . --include <pattern>=
Melebius

52
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./

3
grep -rn "grep için bir şey" --include = *. {modül, inc, c, h} *
ashish

3
Güzel cevap. IMO'da kabul edilenden daha temiz, ancak arama ölçütlerini @ashish işaretli olarak eklemelisiniz
billynoah

neden --includeiğne sonrası seçenek diğer seçeneklerle değil?
vladkras

@vladkras, ne demek iğne? Öyle mi --?
heretoinfinity

50

Nasıl olur:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

5
bu -nameargümanları gruplandırmanızı öneririm . Yapmazsan garip şeyler olabilir. find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
nullrevolution

yalnızca dosyalar ile ilgilenen tüm dizin nesnelerini yoksaymak için ek "-type f" ile kullanın.
kensai

1
Bu yöntemi yıllarca kullandım ve işe yarıyor ama bulmanın exec'i aranacak her dosya için ayrı bir grep süreci oluşturduğundan, yinelemeli grep'ten çok daha yavaş.
Beauder.L

@ Beaudet'in yorumunu ele almak findisteğe bağlı olarak argümanları bir araya getirerek çağrılan sürecin çağrılarını en aza indirir . find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} + Bu önerilen ancak aşağıdaki @ fedorqui'nin cevabında vurgulanmamıştır ve kayda değer bir gelişmedir. -HSadece tek bir eşleme dosyayı tanımlayan bulduğunda buraya grep argüman yararlıdır. Bu, yanıttaki kullanımını ortadan kaldırabilir -print. Toplam dosya listeniz yeterince küçükse, özyinelemeli bir kabuk glob (örn. {path1,path2}/**/*.{cpp,h}) Kullanmak tercih edilebilir.
Malcolm

19

HP ve Sun sunucularında -r seçeneği yoktur, bu şekilde HP sunucumda benim için çalıştı

find . -name "*.c" | xargs grep -i "my great text"

-i dizeye büyük / küçük harfe duyarsız arama içindir


1
Ben fgrep için kullanılabilir --include seçeneği olmayan web hosting şirketleri için birkaç sunucu rastladım ve bu bu durumlarda kullandığım komut satırı.
Borgboy

Windows için Git (MinGW / MSys) kullanılırken --include seçeneği de kullanılamaz.
Darren Lewis

@DarrenLewis, Windows için Git Bash'te bulunur. Ama garip bir şekilde, renkli takma adlar ekler, llancak --color=autogrep'e eklemez .
Xeverous

Tamlık, taşınabilirlik ve kısalık için kabul edilen cevap bu olmalıdır!
Grant Foster

12

Bu dosya bulma meselesi olduğundan kullanalım find!

GNU kullanabilirsiniz bulmak kullanma -regexya uzatma dizinleri ağacında söz konusu dosyaları bulmak için seçenek olduğunu .hveya .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

O zaman, bu sadece grepsonuçlarının her birini yürütme meselesidir :

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Buluntu dağıtımına sahip değilseniz, seçenekleri birleştirmek için Amir Afgani gibi bir yaklaşım kullanmanız -ogerekir ( ad ya .hda ile biter.cpp ):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Ve gerçekten kullanmak istiyorsanız grep, şu sözdizimini izleyin --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

7

En kolay yol

find . -type  f -name '*.extension' | xargs grep -i string 

3

ag (gümüş arayıcı) bunun için oldukça basit bir sözdizimine sahiptir

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

yani

ag -G *.h -G *.cpp CP_Image <path>

ag 2.2.0 kullanarak, ben benim bayrakları son koymak gerekiyordu:ag _string_to_find_ -G _filename_regex_
ryanrain

3

Aşağıdaki cevap iyidir:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

Ancak şu şekilde güncellenebilir:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com

Hangisi daha basit olabilir.


1

Her "-o -name" için "-exec grep" yazmalı

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

Veya bunları () ile gruplandırın

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

'-Hn' seçeneği dosya adını ve satırını gösterir.


1

Bu sorunun biraz tarihli olduğunu biliyorum, ama normalde .c ve .h dosyalarını bulmak için kullandığım yöntemi paylaşmak istiyorum :

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

veya satır numarasına ihtiyacınız varsa:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
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.