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.