42 Soru: Linux'ta belirli bir metin içeren tüm dosyaları nasıl bulurum?

tarafından oluşturulan soru Sun, May 21, 2017 12:00 AM

Linux sistemimin tamamını belirli bir metin dizesini içeren tüm dosyalar için taramanın bir yolunu bulmaya çalışıyorum. Sadece netleştirmek için, dosya adına değil, dosya içindeki metni arıyorum.

Bunun nasıl yapıldığını ararken, bu çözüme iki kez rastladım:

 
find / -type f -exec grep -H 'text-to-find-here' {} \;

Ancak, çalışmıyor. Sistemdeki her bir dosyayı gösteriyor gibi görünüyor.

Bu işlem doğru şekilde yapılıyor mu? Olmazsa nasıl yapmalıyım? Dosyalarda metin dizeleri bulma yeteneği, yaptığım bazı programlama projeleri için olağanüstü faydalı olacaktır.

    
4579
  1. , grep'in .'u diğerlerinin yanı sıra tek karakterli bir joker karakter olarak yorumlayacağını unutmayın. Tavsiyem fgrep veya egrep kullanmaktır.
    2013-10-28 11: 54: 06Z
  2. yine de neredeyse vardınız! Sadece -H'u -l ile değiştirin (ve grep ile fgrep). Belirli ad kalıplarına sahip dosyaları dışlamak için find'u daha gelişmiş bir şekilde kullanırsınız. Yine de find kullanmayı öğrenmek faydalı olacaktır. Sadece man find.
    2013-10-28 12: 01: 23Z
  3. find … -exec <cmd> + yazması daha kolay ve find … -exec <cmd> \;'dan daha hızlıdır. Yalnızca <cmd> herhangi bir sayıda dosya adı bağımsız değişkenini kabul ederse çalışır. <cmd>, Python veya Ruby betikleri gibi başlamak için yavaşsa, yürütme zamanındaki tasarruf özellikle büyüktür.
    2016-01-28 05: 16: 24Z
  4. Belirli bir yolda yinelemeli olmayan bir şekilde arama yapmak için komut `grep --include = *. txt -snw" pattern "thepath /*.
    2016-08-15 12: 34: 35Z
  5. @ StéphaneLaurent Çok fazla karmaşıkladığınızı düşünüyorum. Sadece grep "pattern" path/*.txt deyin
    2016-12-02 13: 13: 16Z
30 Yanıtlar                              30                         

Aşağıdakileri yapın:

 
grep -rnw '/path/to/somewhere/' -e 'pattern'
  •  -r veya -R özyinelemelidir,
  •  -n, satır numarasıdır ve
  •  -w tüm kelimeyle eşleşmeyi ifade eder.
  •  Eşleşen dosyaların dosya adını vermek için -l (küçük harf L) eklenebilir.

Bunlarla birlikte, --exclude, --include, --exclude-dir bayrakları etkin arama için kullanılabilir:

  • Bu, yalnızca .c veya .h uzantılı dosyaları arayacaktır:

     
    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Bu, .o uzantılı biten tüm dosyaların aranmasını hariç tutacaktır:

     
    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Dizinler için --exclude-dir parametresiyle belirli bir dizini (ler) hariç tutmak mümkündür. Örneğin, bu, dir1 /, dir2 /dirs dizinlerini ve bunlarla eşleşen * .dst /:

    dizinlerini dışlar  
    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Bu benim için çok işe yarıyor, sizinkiyle neredeyse aynı amaca ulaşmak için.

Daha fazla seçenek için man grep’u kontrol edin.

    
8280
2018-01-04 03: 57: 06Z
  1. kullanım --exclude. "grep -rnw --exclude = *. o 'dizin' -e" kalıp "gibi
    2013-06-06 08: 29: 44Z
  2. grep's --include parametresini çok yararlı buluyorum. Örneğin: grep -rnw --include = *. Java. -e "aradığım her şey"
    2013-11-14 15: 43: 41Z
  3. görülmeye değer: r seçeneği tembel görünüyor (ilk dizinden sonra durmadan ziyade derinliği geçiyor), R ise açgözlü (tüm ağacı geçecek doğru).
    2015-03-24 15: 09: 46Z
  4. Not (özellikle yeni başlayanlar için): KotaYukarıdaki komuttaki işaretler önemlidir.
    2015-12-22 12: 37: 38Z
  5. @ Eliran Malka R tr r, dizinlerin her ikisini de doğru olarak geçecek, ancak R sembolik bağları izleyecektir.
    2016-07-05 08: 36: 40Z

grep -ilR kullanabilirsiniz:

 
grep -Ril "text-to-find-here" /
  •  i, görmezden gelinme durumuna (durumunuzda isteğe bağlı) karşılık gelir.
  •  R özyinelemeli anlamına gelir.
  •  l "sonucun kendisini değil, dosyanın adını göster" anlamına gelir.
  •  /, makinenizin kökünden başlamak için duruyor.
1313
2016-02-23 10: 02: 31Z
  1. Deneyimlerime dayanarak, -i onu çok yavaşlatıyor, bu yüzden gerekli değilse kullanmayın. Belli bir direkte test edin ve ardından genelleştirin. Birkaç dakika içinde tamamlanmalıdır. Bence düzenli bir ifade yavaşlatır. Ancak yorumlarım varsayımlara dayanıyor, sizi hattın önünde time ile test etmenizi öneririm.
    2013-06-06 08: 14: 37Z
  2. Evet, /* bunun yerine gelir. Neyse, yeni test ettim ve sadece /'un çalıştığını fark ettim.
    2013-06-06 08: 15: 21Z
  3. Bir regex kullanarak arama yapmıyorsanız, çoğu sistemde grep yerine fgrep kullanabilirsiniz.
    2013-09-28 14: 49: 37Z
  4. Evet @ markle976, aslında adam grep'ten: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
    2013-09-30 08: 23: 43Z
  5. Dizini grep -Ril "text-to-find-here" ~/sites/'a /ile değiştirebilir veya kullanabilirsiniz. Geçerli dizin için grep -Ril "text-to-find-here" .
    2016-01-28 12: 19: 30Z

ack adresini kullanabilirsiniz. Kaynak kodu için grep gibidir. Tüm dosya sisteminizi onunla tarayabilirsiniz.

Sadece yapın:

 
ack 'text-to-find-here'

Kök dizininizde.

Ayrıca normal ifadeleri kullanabilirsiniz, dosya türünü belirtin, vb.


GÜNCELLEME

Henüz ack'a benzeyen ancak 3-5x daha hızlı olan ve hatta .gitignore modellerini yok sayan Gümüş Arama Aracı 'nı yeni keşfettim. dosyası.

    
287
2015-03-12 12: 31: 20Z
  1. Çok kullanışlı, basit ve hızlı. Uyarı: "Debian'dan türetilen dağıtımlarda," ack-grep "olarak paketlenme" çünkü "ack" zaten vardı "( adresinden) beyondgrep.com/install ). Bu Linux'larda bir Kanji kod dönüştürücüsü çalıştırmanız gerekebilir ...
    2013-09-20 13: 32: 27Z
  2. ack veya ack-grep güzel özelliklere sahip, ancak uygun kullanıldığında performansta çok daha iyi olduğunda find + grep bulun
    2015-02-11 09: 00: 16Z
  3. ripgrep 'in her şeyden daha hızlı olduğunu unutmayın burada Silver Searcher ve ova grep dahil. Kanıt için bu blog gönderisine bakın.
    2017-10-14 04: 01: 00Z

Kullanabilirsiniz:

 
grep -r "string to be searched"  /path/to/dir

r özyinelemeli anlamına gelir ve bu nedenle belirtilen yolda ve alt dizinlerinde arama yapar. Bu, dosya adını söyler ve dizenin göründüğü dosyadaki satırı yazdırır.

Veya tüm javascript dosyalarında (* .js) arama yapmak için denediğinize benzer bir komut (örnek:):

 
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Bu, metnin göründüğü dosyadaki satırları yazdırır, ancak dosya adını yazdırmaz.

Bu komuta ek olarak, şunu da yazabiliriz: grep -rn "Aranacak dize" /yol /dizin /veya /dosya -r: özyinelemeli arama n: Eşleşmeler için satır numarası gösterilecek

    
163
2018-04-02 08: 35: 40Z
  1. Find sürümü için Thanx. Grep sürümüm (NAS için meşgul kutusu) -r seçeneğine sahip değildi, gerçekten başka bir çözüme ihtiyacım vardı!
    2016-09-02 10: 34: 12Z
  2. 'Bulma' sürümü için teşekkür ederiz! ' .js' veya ' .txt' vb. İle filtre uygulayabilmeniz çok önemlidir. Hiç kimse, son multi-gigabaytlı videoların tamamını arama işlemini bitirmek için saatlerce beklemek istemiyor. tatil, komut yazmak daha kolay olsa bile.
    2017-08-16 15: 10: 25Z

Bunu kullanabilirsiniz:

 
grep -inr "Text" folder/to/be/searched/
    
99
2013-07-31 14: 09: 59Z
  1. en kolay, ayrıntılı, özyinelemeli ve büyük /küçük harfe duyarsız. yaşasın.
    2015-04-09 12: 44: 43Z
  2. -A3 eklerseniz daha da iyidir
    2016-02-24 10: 43: 04Z

Belirli bir metni içeren dosya adlarının listesi

Öncelikle, -H yerine -l kullandığına inanıyorum. Ayrıca, metni {} \ izleyen tırnak içine eklemeyi deneyebilirsiniz.

 
find / -type f -exec grep -l "text-to-find-here" {} \; 

Örnek

Dizininizde "Apache License" adlı belirli bir metni içeren dosyaları aradığınızı varsayalım. Sonuçları aşağıdakine benzer şekilde görüntüler (çıktı, dizininizin içeriğine bağlı olarak değişir).

 
bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Büyük küçük harf duyarlılığını kaldırın

"text" vs "TEXT" gibi bir dava hakkında kullanılmasanız bile, davayı yoksaymak için -i anahtarını kullanabilirsiniz. Daha fazla ayrıntıyı burayı okuyabilirsiniz.

Bunun size yardımcı olmasını umarım.

    
60
2017-10-07 05: 54: 21Z
  1. Bu komutun yaptığı şey: find, bulacağı tüm yolları grep -l "text-to-find-here" <file found>" komutuna geçirir. Örneğin, dosya adına kısıtlamalar ekleyebilirsiniz. Yalnızca find / -iname "*.txt" ile biten adlarda arama yapmak için .txt
    2017-04-20 13: 46: 45Z
  2. @ Auxiliary - okuyucular için karışıklıktan kaçınmak için bir örnek çıktı dahil etti.
    2017-10-07 05: 56: 16Z
  3. @ Mene Bu, Auxiliary'in yorumunun sizinkinden daha fazla oy alması gerçekten üzücü bir durumdur. tam olarak 0 olmalı ve seninki sadece bir tane (şimdi iki tane) inanmak istediğim bir şey değildi.
    2018-05-01 23: 01: 52Z
  4. @ Mene Söylenen -iname durumdur -duyarsız olan, örneğin .TXT dosyalarını, örneğin TxT ve TXt ve benzerlerini bulacağı anlamına gelir.
    2018-05-01 23: 04: 37Z

grep ( GNU veya BSD )

Geçerli klasörü aramak için tekrar tekrar aramak için grep aracını kullanabilirsiniz:

 
grep -r "class foo" .

Not: -r - Alt dizinleri tekrarlı olarak arayın.

Şunlar gibi belirli dosyaları aramak için globbing sözdizimini de kullanabilirsiniz:

 
grep "class foo" **/*.c

Not: globbing seçeneğini kullanarak **), tüm dosyaları özyinelemeli olarak belirli bir uzantı veya desen ile tarar. Bu sözdizimini etkinleştirmek için şu komutu çalıştırın: shopt -s globstar . Ayrıca, tüm dosyalar için **/*.* kullanabilirsiniz (hariç gizli ve uzatma olmadan) veya başka bir desen.

Bağımsız değişkeninizin çok uzun olması durumunda, aramanızı daraltmayı düşünün veya bunun yerine find sözdizimini kullanın:

 
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Alternatif olarak ripgrep . kullanın.

ripgrep

Daha büyük projeler veya büyük dosyalar üzerinde çalışıyorsanız, bunun yerine ripgrep kullanmalısınız:

 
rg "class foo" .

GitHub proje sayfasındaki dokümanları, kurulum adımlarını veya kaynak kodunu kontrol edin.

GNU / BSD grep , ucg , ag , sift , ack , pt veya benzeri sonlu otomata, SIMD ve agresif değişmez optimizasyonlar kullanan Rust'un regex motoru üzerine inşa edilmiştir çok hızlı arama.

.gitignore dosyada belirtilen görmezden gelme desenlerini destekler, böylece tek bir dosya yolu aynı anda birden fazla küre deseniyle eşleştirilebilir.


Şunlar gibi ortak parametreleri kullanabilirsiniz:

  •  -i - Duyarsız arama.
  •  -I - İkili dosyaları yoksay.
  •  -w - Tüm sözcükleri ara (kısmi sözcük eşleşmesinin tersine).
  •  -n - Maçınızın satırını gösterin.
  •  -C/--context (ör. -C5) - İçeriği arttırır, böylece çevre kodunu görürsünüz.
  •  --color=auto - Eşleşen metni işaretleyin.
  •  -H - Metnin bulunduğu dosya adını görüntüler.
  •  -c - Eşleşen satır sayısını görüntüler. -H ile birleştirilebilir.
55
2018-04-10 13: 55: 15Z
  1. Ayrıca genişletilmiş globbing'i faydalı buluyorum. Ancak, gerçekten çok sayıda dosya varsa, "çok uzun bir tartışma listesi" hatası alabileceğinizi unutmayın. (Basit globbing de bu tür bir hataya meyillidir).
    2017-11-30 06: 47: 02Z
  2. Tüm dosya sistemini teneffüs etmek için, rg diğer tüm araçlardan çok daha az acı verici olacaktır.
    2019-04-23 06: 11: 54Z

grep'unuz özyinelemeli aramayı desteklemiyorsa, find'u xargs ile birleştirebilirsiniz:

 
find / -type f | xargs grep 'text-to-find-here'

Bunu hatırlamamı find -exec formatından daha kolay buluyorum.

Bu, dosya adını ve eşleşen satırın içeriğini gösterir (ör.

).  
/home/rob/file:text-to-find-here

grep'a eklemek isteyebileceğiniz isteğe bağlı bayraklar:

  •  -i - büyük /küçük harf duyarsız arama
  •  -l - yalnızca eşleşmenin bulunduğu dosya adını çıkar
  •  -h - yalnızca eşleşen satırı çıktı (dosya adı değil)
51
2015-08-12 09: 19: 16Z
  1. grep 'text-to-find-here' bir şey bulamazsa, dosya adı olmadan find'a eşdeğerdir. Bu kilitlenecek ve kullanıcı girişi için bekleyecek! --no-run-if-empty'a bir seçenek olarak xargs ekleyin.
    2016-01-28 05: 46: 33Z
  2. Bu find ve xargs birleşimi, dosya veya dizin adları boşluk içeriyorsa (xargs ayırıcı olarak yorumlayan karakterler) amaçlandığı gibi çalışmaz. find … -exec grep … +'u kullanın. Find'i xargs ile birlikte kullanmakta ısrar ediyorsanız, -print0 ve -0'u kullanın.
    2016-01-28 05: 50: 11Z
 
grep -insr "pattern" *
  •  i: Hem PATTERN hem de giriş dosyalarındaki büyük /küçük harf farklarını yoksay.
  •  n: Her çıktı satırını, girdi dosyasında 1 tabanlı satır numarasıyla önekleyin.
  •  s: Var olmayan veya okunamayan dosyalarla ilgili hata mesajlarını bastır..
  •  r: Her dizinin altındaki tüm dosyaları tekrar tekrar oku.
38
2016-03-08 07: 39: 14Z
  1. Yanıtınızın diğer cevaplar üzerinde nasıl geliştiğini veya onlardan yeterince farklı olduğunu açıklayabilir misiniz?
    2016-02-26 06: 10: 08Z
  2. hatırlanması gereken çok karmaşık değil, tüm desenleri kapsayacak (büyük /küçük harf - > kapalı, dosya adları ve satır numarası içerecek ve tekrarlamalı olarak arama yapacaktır vb.) ve kullanma Sonunda "*" tüm dizinleri arayacaktır (herhangi bir yol veya dizin adı belirtmenize gerek yoktur).
    2016-02-26 06: 15: 40Z
  3. Üzgünüm, daha açık olmalıydım: cevabınıza bu açıklamayı ekleyebilirseniz çok iyi olurdu. Özellikle halihazırda bir çok benzer cevabın olduğu haliyle, bu kadar kısa bir cevabın, kabul edilen cevabın üzerine ya da en çok oylananlardan birinin ne olacağını denemenin faydasını görmek zor. /div>
    2016-02-26 06: 35: 01Z
  4. @ AmosM.Carpenter Bu cevabı sevdiğim bir şey, gerçekte sonuç almamızın önemini olmayan gürültüyü filtrelemeye yardımcı olabilecek bastırma argümanına işaret ediyor. istemek. Grep, bazı "dosyalar" üzerine "İşlev gerçekleştirilmedi", "Geçersiz Değişken", "Kaynak kullanılamıyor" vb. Gibi hataları yazdırır.
    2017-02-20 05: 58: 27Z
  5. @ leetNightshade: Yorumunuzu benimle paylaştığınızı farz ediyorum, çünkü seyrek orijinal yazı hakkında bir açıklama istedim. Lütfen daha önceki yorumlarım için Fabio'nın mükemmel revizyonuna bakın.
    2017-02-20 11: 59: 14Z
  

Linux'ta belirli bir metni içeren tüm dosyaları nasıl bulurum?   (...)

     

Bu çözüme iki kez rastladım:

     

find / -type f -exec grep -H 'text-to-find-here' {} \;


bulun kullanıyorsanız Örnekte olduğu gibi, -s ve --no-messages tarafından yayınlanan İzin reddedildi iletilerinin çoğunu önlemek için komutun sonuna grep’u (2>/dev/null) grep’a ve find’u daha iyi ekleyin:

 
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

bulun Unix benzeri platformlarda, dosyaları aramak için standart bir araç - belirli bir metin ararken grep ile birlikte -. find komutu genellikle xargs .

Aynı amaç için daha hızlı ve daha kolay araçlar mevcuttur - aşağıya bakın. Bunları daha iyi deneyin, elbette platformunuzda mevcut olmaları koşuluyla , elbette:

Daha hızlı ve daha kolay alternatifler

RipGrep - en hızlı arama aracı:

 
rg 'text-to-find-here' / -l

Gümüş Arama Aracı :

 
ag 'text-to-find-here' / -l

ack :

 
ack 'text-to-find-here' / -l

Not: Çok sayıda hata mesajını gizlemek için bu komutlara 2>/dev/null ekleyebilirsiniz.


Uyarı : gerçekten önleyemezseniz, (kök dizin) !  Bu nedenle, yukarıdaki örneklerde, ' /' yi bir alt dizin adıyla değiştirmelisiniz, ör. "/home" gerçekte nerede aramak istediğinize bağlı olarak ...

    
30
2018-06-02 17: 21: 54Z
  1. ', Unix benzeri platformlarda belirli bir metin içeren dosyaları aramak için kullanılan standart araçtır' benim için oldukça belirsiz görünüyor. Özyinelemeli olsa da grep find doğrudan dosyaların içindeki metinleri aramaz. Ve belki de bu ek araçlar bazı eski zamanlayıcılar ve örneğin; grep hiçbir zaman onlara zaman vermez (kesinlikle vermeyeceğim). Ancak işe yaramaz olduklarını söylemiyorum.
    2018-05-01 23: 36: 48Z
  2. ".... belirli bir metni içeren ...": cümlenin bu kısmı doğru değildi (çünkü aramanın bu kısmıyla ilgilenen kendini bulamıyor) ). Düzenlenen. Teşekkürler.
    2018-06-01 09: 21: 33Z
  3. Yardımcı olmaktan mutluluk! Çok hızlı bir bakışta başka tek şey, klasör kelimesini klasöre değiştirmektir ancak bunun benim bir haçlı seferinin asla kazanamayacağımı biliyorum. Yine de pes etmemek ...
    2018-06-01 16: 13: 32Z
  4. Neden "klasör" yerine "dizin" değil, neden? Lütfen "haçlı seferinizi" paylaşın!
    2018-06-01 17: 00: 56Z
  5. Kullanım dizinini söylüyorum! Aşağıdakilere atıfta bulunun: '/' yerine bir alt klasör adı koyacaksanız daha iyi olur Ve bu benim evcil hayvanlarımdan birkaçı. Özellikle Windows bile 'dizin' olarak adlandırdığından beri. Ah ... belki de onu aldın. Niye ya? Çünkü buna buna denir. Buna dosya sistemi düzeyinde de deniyor. Şuna şöyle bak: Hiç denilen (DOS için) fol ? Hayır tabii değil; dir olarak adlandırıldı (ve hala öyle olduğuna inanıyorum). Klasör (sanırım) kullanıcı dostu olması için tasarlanan bir şey olsa da, bu durumda belki daha az 'ileri düzeyde' kullanıcılar için onu aşağılama olabilir mi?
    2018-06-02 00: 15: 19Z

Dene:

 
find . -name "*.txt" | xargs grep -i "text_pattern"
    
27
2015-04-17 15: 33: 47Z
  1. Bu aslında xargs'u böyle kullanmamanın en iyi örneğidir. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo. Buradaki xargs WRONG dosyasıyla eşleşti ve amaçlanan dosyayla eşleşmedi. Ya bir find .. -print0 | xargs -0 ... kullanın, ancak bu bir borunun işe yaramaz bir kullanımı ya da daha iyi bir find ... -exec grep ... {} +
    2016-10-11 20: 10: 13Z

Silversearcher adlı yeni bir yardımcı program var

 
sudo apt install silversearcher-ag

Git ve diğer VCS ile yakın çalışır. Böylece bir .git veya başka bir dizinde hiçbir şey elde edemezsiniz.

Basitçe kullanabilirsiniz

 
ag -ia "Search query"

Ve bu senin için işi yapacak!

    
27
2017-05-25 00: 08: 18Z

Bulunduğunuz dizinden arama yapmak için pwd’u kullanın, aşağı doğru özyin

 
grep -rnw `pwd` -e "pattern"

Güncelle Kullanmakta olduğunuz grep sürümüne bağlı olarak, pwd'u atlayabilirsiniz. Daha yeni sürümlerde ., hiçbir dizin belirtilmemişse, grep için varsayılan durum gibi görünüyor Bu şekilde

grep -rnw -e "pattern"

veya

grep -rnw "pattern"

yukarıdakiyle aynı şeyi yapar!

    
26
2017-02-02 12: 29: 21Z
  1. , pwd'u kullanmak gerekli değildir, çünkü varsayılan ayardır. grep -rnw "pattern" yeterli.
    2016-12-02 13: 17: 04Z
  2. ve aslında grep -rnw ve benzerleri üç yıl önceki gibi cevaplandı, bu cevabın nasıl değer kattığını göremiyorum.
    2016-12-02 14: 03: 42Z
  3. Seçilen cevap varsayılan modeli göstermiyor ve 5 kişi yararlı bulmuş görünüyordu
    2016-12-14 08: 27: 11Z
  4. "Varsayılan kalıp" ile ne demek istiyorsunuz? Kabul edilen cevap, burada sahip olduğunuz şey olan grep -rnw '/path/to/somewhere/' -e "pattern"'u içerir. 2.3M ziyaretinden sonra 5 oy bu kadarını ifade etmiyor.
    2016-12-14 08: 45: 01Z
  5. Katılıyorum :-) orjinal cevabımdaki eksiklik, bir yol belirtmek zorunda olmadığınız ya da mevcut dizini aramak zorunda olmadığınız kullanım durumudur. özyinelemeli olan cevap kabul edilmez. Bu yüzden, grep hakkında biraz daha derine inmek iyi bir öğrenme deneyimiydi.
    2016-12-14 14: 05: 21Z

grep bir dize aramasak bile kullanılabilir.

Basitçe çalışıyor,

 
grep -RIl "" .

tüm metin dosyalarına, yani yalnızca yazdırılabilir karakterleri içerenlere giden yolu yazdırır.

    
18
2017-05-25 00: 01: 43Z
  1. Bunun sadece ls veya find (özyinelemeli için) kullanmaktan daha iyi olduğunu görmüyorum
    2016-12-02 13: 15: 42Z

İşte dosya aramak için kullanılabilecek birkaç komut listesi.

 
grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path
    
16
2014-02-01 05: 47: 35Z
  1. bu mevcut cevaplara ne ekliyor?
    2016-12-02 13: 14: 58Z
  2. @ fedorqui egrep, grep -E’a eşdeğerdir ve --extended-regexp’a eşittir, ayrıntıları burada bulabilirsiniz unix.stackexchange.com/a/17951/196072
    2018-07-25 11: 00: 42Z
 
find /path -type f -exec grep -l "string" {} \;

Yorumlardan açıklama

find, dosyaları ve directorie gibi diğer nesneleri bulmanızı sağlayan bir komuttur.s ve verilen bir yolun alt dizinlerindeki bağlantılar. Dosya adlarının karşılaması gereken bir maske belirtmezseniz, tüm dizin nesnelerini numaralandırır.

 
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
    
14
2014-11-26 13: 12: 58Z

Dene:

 
find / -type f -exec grep -H 'text-to-find-here' {} \;

tüm dosya sistemlerini arayacaktır, çünkü / kök klasördür.

Ev klasörü kullanımı için:

 
find ~/ -type f -exec grep -H 'text-to-find-here' {} \;

Geçerli klasör kullanımı için:

 
find ./ -type f -exec grep -H 'text-to-find-here' {} \;
    
14
2015-05-09 09: 49: 54Z
  1. Belki de klasörlerin farklılıklarıyla ilgili ayrıntılar birçok kişi için açıktır ... ama aynı zamanda yeni başlayanlar için de çok yardımcıdır. 1
    2016-10-17 18: 07: 09Z
  2. bu mevcut cevaplara ne ekliyor?
    2016-12-02 13: 16: 03Z
  3. Haçlı seferimi çağır ama kelime 'dizin'. Bu Windows değil (zaten 'dizin' kullanmak için kullanılan - 9x öncesi). Lütfen 'klasör' demeyi bırakın. Son emrinize gelince, '/' sadece FYI'ye bile ihtiyacınız yok.
    2018-05-01 23: 12: 12Z

Bunun yardımcı olacağını umuyorum ...

Çıktıda daha fazla bilgi vermek için, örneğin metnin yapıldığı dosyadaki satır numarasını almak için grep'u biraz genişletmek:

 
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

Dosya türünün ne olduğu hakkında bir fikriniz varsa, aranacak dosya türü uzantılarını belirterek aramanızı daraltabilirsiniz, bu durumda .pas VEYA .dfm dosyalar:

 
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

Seçeneklerin kısa açıklaması:

  1.  .'daki find, geçerli dizinden belirtir.
  2.  -name "*.*": tüm dosyalar için (-adı "*.pas" -o -adı "*.dfm"): Yalnızca *.pas VEYA *.dfm dosyaları, VEYA -o ile belirtilen
  3.  -type f, dosyaları aradığınızı belirtir
  4.  -print0'un (borunun) diğer tarafındaki --null ve |, dosya adlarını find'dan grep'a gömülmüş xargs'dan -name '*.*''a gömülerek, grepin yolunu işlemesine izin veren önemli adlardır. ve dosya adı bir dizedir ve her alanda ayrılmaz.
14
2017-05-25 00: 03: 28Z
  1. * söyledikleriniz değil; 'dosya' adında bir dosyayı seçmez çünkü kalıp buna eşit değildir (no .ext); Ancak find olur (bir kenara. Ama başka bir şey daha var: Eğer tüm dosyaları istiyorsanız, neden bir dosya adı belirtmeyi başarabilirsiniz? Başka yorum yok - hala MS terminoloji 'klasörünü' kullanmayan insanlar olduğunu bilmek dışında güzel ki (bu gerçekten yeterince söyledikten sonra ekleyemem ama yaptığınız biraz yanlış ifadeye işaret etmek istedim. dosya adları ile - yanı sıra 'tümü' durumunda artıklık /yararsızlık).
    2018-05-01 23: 25: 18Z

Silver Searcher müthiş bir araçtır, ancak ripgrep daha da iyi olabilir.

Linux, Mac ve Windows üzerinde çalışır ve bir çift Hacker News üzerine yazılmıştır. ay önce (bunun Andrew Gallant'ın GitHub bağlantısı olan Blog'una bir bağlantısı var):

Ripgrep - Yeni bir komut satırı arama aracı     

14
2017-05-25 00: 10: 37Z

Basit bir ~/.bashrc kullanışlı çalışabilir.

alias ffind find / -type f | xargs grep
dosyanızdaki diğer adı:  
ffind 'text-to-find-here'

Yeni bir terminal başlat ve sorun:

 
./sniff.py path pattern_to_search [file_pattern]
    
14
2017-05-25 00: 15: 03Z

Benzer bir şey yapan bir Python betiği yazdım. Bu komut dosyasını nasıl kullanmanız gerektiğidir.

 path

İlk argüman, pattern_to_search, tekrarlı olarak arayacağımız dizindir. İkinci argüman olan re, dosyada aramak istediğimiz normal bir ifadedir. Python . kütüphanesinde tanımlanan normal ifade biçimini kullanıyoruz. Bu komut dosyasında, file_pattern da yeni satırla eşleşir.

Üçüncü argüman, py isteğe bağlıdır. Bu bir dosya adı üzerinde çalışan başka bir düzenli ifadedir. Sadece bu normal ifadeyle eşleşen dosyalar dikkate alınacaktır.

Örneğin, Pool( ve Adaptor kelimesini içeren

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 
uzantılı Python dosyalarını aramak istersem aşağıdakileri yaparım.  
grep -c Your_Pattern *

Ve işte, eşleşen dosyaların yolunu ve eşleşmenin bulunduğu satır numarasını oluşturur. Birden fazla eşleşme bulunursa, her satır numarası dosya adına eklenecektir.

    
13
2014-06-30 17: 59: 08Z

Kullanım:

 
for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

Bu, geçerli dizindeki dosyaların her birinde deseninizin kaç kopyasının bulunduğunu bildirir.

    
12
2017-05-25 00: 13: 12Z

Dizeyi aramak ve arama dizesiyle yalnızca bu satırın çıktısını almak için:

 
for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

örn.

 
for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

Arama dizesini içeren dosya adını görüntülemek için:

 
for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;

örn.

 find … -exec grep 'str' {} \;     
11
2014-01-25 11: 08: 41Z
  1. find kullanmaya kıyasla (yalnızca find kullanmanız gerekirse) yalnızca olumsuz taraf görüyorum.
    2016-10-07 16: 14: 29Z
  2. grepping tarafından bulunan dosyalardan herhangi biri boşluk içeriyorsa, bu korkunç bir şekilde kırılır. Yalnızca find ... -exec grep ...'u kullanmanız gerekirse, find'u kullanın .. ancak bu durumda grep -r ... yeterlidir.
    2016-10-11 20: 19: 36Z
  3. Bulun ardından grep'in sonuçları üzerinde bir döngü kullanmanın amacı nedir? Bu gereksiz yere karmaşıklaşıyor.
    2016-12-02 13: 17: 45Z

Tam olarak aradığınızı yapacak ack bir araç var.

http://linux.die.net/man/1/ack /p>  

ack -i search_string folder_path/*

Büyük /küçük harfe duyarlı arama için -i numaralı bilgiyi yok sayabilirsiniz.

    
11
2017-07-13 00: 17: 58Z
  1. Bu mevcut cevaplara ne ekliyor? Bu zaten üç yıldan daha önce önerildi.
    2016-12-02 13: 20: 15Z
  2. @ fedorqui 1) boru bağlantısı yok! 2) Düzenli ifadeler kullanın 3) Sonradan düzenleme için yararlı olan satır numaralarını, ilgili yolu içeren dosya adını, vurgulanan metni vb. Alın."vim + lineno path /file.cpp" araması sizi ilgilendiren satırda görmenizi sağlar. Arama klasörümün ve alt klasörlerin altındaki "include" veya "hpp" anahtar kelimelerini arayan "ack include \| hpp" komutunun çıktısına bakın. Umarım konu açıktır. İşte örnek çıktı (anahtar kelimeyle vurgulanan metinleri basit metinlerle gösteremiyorum) process /child.hpp 11: boost /process /child.hpp process /all.hpp 21: #include < boost /process /execute.hpp >
    2017-07-11 15: 57: 42Z

grep, bunu başarmak için en iyi arkadaşınız.

 
grep -r <text_fo_find> <directory>

Bulunacak metnin durumuyla ilgilenmiyorsanız, kullanın

 
grep -ir <text_to_find> <directory>
    
11
2017-10-24 03: 07: 22Z
  1. Benim durumumda, dizini belirtsem bile her yerde arama yapıyor gibi görünüyor
    2018-03-20 16: 30: 36Z
  2. @ Pathros Özyineleme etkin ve muhtemelen hangi dizini belirttiğinizle ilgili. Başka bir deyişle, özyineleme işleri bu şekilde değiştirir.
    2018-05-01 23: 38: 17Z
  3. @ Pathros Oh ve arama dizesinde - varsa, -- içinde iletmek istersiniz > önce grep yapmak; Aksi takdirde ilginç yan etkilere neden olabilir!
    2018-06-02 00: 25: 19Z

Önceki tüm cevaplar grep ve bulmayı önerir. Ancak başka bir yol var: Midnight Commander

'i kullanın

GUI olmadan görsel olan ücretsiz bir yardımcı programdır (30 yaşında, zamanıyla kanıtlanmış). Tonlarca işlevi vardır ve dosyaları bulmak bunlardan sadece bir tanesidir.

    
11
2019-04-24 15: 28: 42Z
  1. ranger aynı fikirde olurdu
    2017-07-12 20: 03: 37Z

Aşağıdaki komut bu yaklaşım için iyi çalışacaktır:

 
find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
    
10
2016-02-16 23: 47: 15Z
  1. find ve ardından grep -r kullanmanın amacı nedir? Onlar aynı anlama geliyor, bu yüzden bu gereksiz.
    2015-12-23 17: 02: 39Z
  2. ohh !! düzeltildi, Aslında bul, filtrelenmiş dosyalar üzerinde grep çalıştırmak içindir, hepsine değil teşekkürler
    2015-12-30 15: 25: 08Z
  3. hala, bu hiç mantıklı değil, find ile filtreleyebilirsiniz.
    2016-12-03 23: 00: 59Z

Güçlükten kaçının ve ack-grep'i kurun. Birçok izin ve teklif sorununu ortadan kaldırır.

 
apt-get install ack-grep

Ardından aramak istediğiniz dizine gidin ve aşağıdaki komutu çalıştırın

 
cd /
ack-grep "find my keyword"
    
10
2016-03-23 ​​03: 41: 43Z

Bunu dene:

 
find . | xargs grep 'word' -sl
    
10
2017-05-25 00: 02: 19Z
  1. bu grep çözümünden çok daha yavaştır
    2014-12-22 16: 58: 35Z
  2. @ amine grep kullanmak yerine, doğrudan find , çalışan xargs dosyasını bulur grep üzerinde. Bunu anladığına eminim ama sadece ekleyemeyenler için. Buradaki komut şudur: İyi bir benzetme düşünemiyorum ama bu çok fazla gereksiz ve zararsız ek yük ekliyor.
    2018-06-02 01: 34: 08Z

Grep'in 'rl' ile ne kadar basitleştirildiğine hayran kaldım

 
grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'
  

Dosya adlarını görmek için 'l' olmadan '-r' kullanın ve ardından kalıbın bulunduğu metin !

 
grep -r 'pattern_to_find' /path/where/to/find

Sadece mükemmel çalışıyor ..

Umarım yardımcı olur!

    
10
2017-09-04 06: 13: 54Z
  1. Bu, Git Bash (Windows).
    2019-04-24 15: 32: 18Z
  2. Ancak her dosyanın aranması gerektiği anlamına gelir (.txt gibi dosya adı veya dosya uzantısı düzeyinde filtre yok). Yoksa bunu yapmanın bir yolu var mı?
    2019-04-24 16: 17: 02Z
kaynak yerleştirildi İşte