Soru Linux'ta belirli bir metni içeren tüm dosyaları nasıl bulabilirim?


Tüm Linux sistemimi belirli bir metin dizesi içeren tüm dosyalar için taramanın bir yolunu bulmaya çalışıyorum. Açıklığa kavuşturmak için, dosya içinde değil, dosya içinde metin arıyorum.

Bunu nasıl yapacağımı ararken, iki kez bu çözüme rastladım:

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

Ancak işe yaramıyor. Sistemdeki her bir dosyayı gösterir gibi görünüyor.

Bunu yapmanın doğru yolu bu mu? Yoksa, nasıl yapmalıyım? Dosyalarda metin dizeleri bulma yeteneği, yaptığım bazı programlama projeleri için olağanüstü derecede yararlı olacaktır.


3693
2018-06-06 08:06


Menşei


grep'in herhangi bir yorumu yorumlayacağını unutmayın . diğerleri arasında tek karakterli bir joker olarak. Benim tavsiyem, ya fgrep ya da egrep'i kullanmaktır. - Walter Tross
Neyse, neredeyse oradaydın! Sadece değiştir -H ile -l (ve belki grep ile fgrep). Dosyaları, kullanacağınız belirli isimlerle hariç tutmak için find daha gelişmiş bir şekilde. Kullanmayı öğrenmek için çok değerli findolsa da. Sadece man find. - Walter Tross
find … -exec <cmd> + yazmak daha kolay ve daha hızlı find … -exec <cmd> \;. Sadece çalışırsa <cmd> herhangi bir sayıda dosya adı argümanını kabul eder. Uygulama zamanındaki tasarruf özellikle büyükse <cmd> Python veya Ruby komut dosyaları gibi yavaş başlar. - hagello
Belirli bir yolla yinelemeli olarak arama yapmak için komut grep -include = * .txt -snw "pattern" thepath / * şeklindedir. - Stéphane Laurent
@ StéphaneLaurent Bence bunu çok karmaşıklaştırıyorsun. Sadece söyle grep "pattern" path/*.txt - fedorqui


Cevaplar:


Aşağıdakileri yapın:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r veya -R özyineli
  • -n satır numarası ve
  • -w tüm kelimeyi eşleştirmek için duruyor.
  • -l (küçük harf L) sadece eşleşen dosyaların dosya adını vermek için eklenebilir.

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

  • Bu yalnızca .c veya .h uzantılarına sahip olan dosyaları arayacaktır:

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

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Dizinler için belirli bir dizini (dizinleri) --exclude-dir parametre. Örneğin, bu dirs dir1 /, dir2 / ve bunların tümü * .dst /:

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

Bu benim için çok iyi çalışıyor, seninki gibi neredeyse aynı amaca ulaşmak için.

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


6681
2018-06-06 08:21



--exclude kullanın. "grep -rnw --exclude = *. o 'directory' -e" deseni gibi - rakib_
Grep's --include parametresini çok yararlı buluyorum. Örneğin: grep -rnw --include = *. Java. -e "ne aradığımı" - Lucas A.
dikkat etmeye değer: görünüyor r seçenek tembeldir (ilk dizinden sonraki duruşlardan derinlik-ilk önce geçiş yapar), R açgözlüdür (tüm ağaca doğru bir şekilde geçecektir). - Eliran Malka
Not (özellikle yeni başlayanlar için): Yukarıdaki komuttaki tırnak işaretleri önemlidir. - madD7
@Eliran Malka R tr r her ikisi de dizinleri doğru şekilde değiştirir, ancak R sembolik bağları takip edecek. - bzeaman


Kullanabilirsiniz grep -ilR:

grep -Ril "text-to-find-here" /
  • i ihmal davası anlamına gelir (davasında isteğe bağlı).
  • R özyinedir.
  • l "dosya adını, sonucun kendisini göster" anlamına gelir.
  • / Makinenizin kökünden başlıyor.

1087
2018-06-06 08:08



Deneyimlerime dayanarak, -i yavaşlatır, bu yüzden gerekli değilse kullanmayın. Belirli bir direkte test edin ve sonra genelleyin. Birkaç dakika içinde tamamlanmalıdır. Bence normal bir ifade onu yavaşlatır. Ama yorumlarım öneriye dayanıyor, bunu test etmenizi öneririm time hattın önünde. - fedorqui
Evet, /* bunun için duruyor. Her neyse, sadece test ettim ve fark ettim ki / Eserleri. - fedorqui
Bir regex kullanarak arama yapmıyorsanız çoğu sistemde grep yerine fgrep kullanabilirsiniz. - markle976
Evet @ markle976, aslında erkek grep'ten: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings. - fedorqui
Dizinin yolunu değiştirebilirsin grep -Ril "text-to-find-here" ~/sites/ veya kullan . geçerli dizin için grep -Ril "text-to-find-here" . - Black


Kullanabilirsiniz ack. Öyle gibidir grep kaynak kodu için. Tüm dosya sisteminizi onunla tarayabilirsiniz.

Sadece yap:

ack 'text-to-find-here'

Kök dizinde.

Ayrıca kullanabilirsiniz düzenli ifadeler, filetype vb. belirtin.


GÜNCELLEŞTİRME

Yeni keşfettim Gümüş Aramaack gibi ama 3-5x daha hızlı ve hatta desenleri birinden yok sayar .gitignore dosya.


234
2018-06-06 08:26



Çok kullanışlı, basit ve hızlı. Uyarı: "Debian türevli dağıtımlarda, ack" ack-grep "olarak paketlenmiştir, çünkü" ack "zaten var" beyondgrep.com/install). Bu Linux'larda bir Kanji kod çevirici çalıştırabilirsin ... - Jose_GD
ack veya ack-grep'in güzel özellikleri vardır, ancak uygun kullanıldığında + grep'i performansta daha iyi bulur - Sławomir Lenart
Bunu not et ripgrep Silver Searcher ve sade 'ol grep dahil olmak üzere burada bahsedilen her şeyden daha hızlıdır. Görmek bu blog yazısı kanıt için. - Radon Rosborough


Kullanabilirsiniz:

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

r özyinelemeyi temsil eder ve böylece belirtilen yolda ve ayrıca alt dizinlerini de arar. Bu size dosya ismini söyleyecektir, ayrıca dizinin görüntülendiği dosyadaki satırı yazdıracaktır.

Ya da tüm javascript dosyalarında (* .js) arama yapmak için çalıştığınız benzetme (örnek:):

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

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

Bu komuta ek olarak şunu da yazabiliriz: grep -rn "Aranacak String" / path / to / directory / or / file -r: özyinel arama n: maçlar için hat numarası gösterilecek


126
2018-03-14 23:29



Bul sürümü için teşekkürler. Benim grep sürümüm (NAS için busybox) -r seçeneği değil, gerçekten başka bir çözüme ihtiyacım vardı! - j.c
'Bul' versiyonu için teşekkürler! 'Filtrelemek için çok önemlidir'.js 'veya'.txt ', vb. Kimse grep'in son aile tatilindeki tüm gigabyte videoları aramayı bitirmesini beklemek zorunda kalmaz. - mightypile


Bunu kullanabilirsiniz:

grep -inr "Text" folder/to/be/searched/

83
2017-07-31 13:44



En kolay, ayrıntılı, özyineli ve büyük harf duyarsız. başparmak havaya. - Francesco Casula
eklerseniz -A3 daha iyi - albanx
Bu çok havalı. - kodmanyagha


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

Her şeyden önce, kullandığınıza inanıyorum -H yerine -l. Ayrıca, alıntılar içindeki metni eklemeyi de deneyebilirsiniz. {} \.

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

Örnek

Dizininizde belirli bir metin olan "Apache Lisansı" içeren dosyaları aradığınızı varsayalım. Aşağıdakine benzer bir sonuç gösterecektir (dizin içeriğinize göre çıktı farklı olacaktır).

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 harf duyarlılığını kaldır

"METİN" veya "METİN" gibi bir durumda kullanmıyor olsanız bile, -i davayı görmezden gelmek için geçiş yapın. Daha fazla bilgi okuyabilirsiniz İşte.

Umarım bu size yardımcı olur.


50
2017-11-09 13:18



OP, içeriğinde metin içermeyen dosyaları dosya adı olarak istemedi. - Auxiliary
Bu komutun yaptığı şey: find bulduğu tüm yolları komutta geçirecek grep -l "text-to-find-here" <file found>". Dosya adına kısıtlamalar ekleyebilirsiniz, ör. find / -iname "*.txt" sadece hangi ismin bittiği dosyalarda aramak .txt - Mene
@Auxiliary - okuyucular için herhangi bir karışıklık olmaması için bir örnek çıktı içeriyordu. - lkamal
@Mene Auxiliary'nin yorumunun sizinkinden daha fazla oyu alması gerçekten üzücü bir durum ... yorumları 2014'ten gelse bile, sizin yorumunuz 6 ise, tam olarak 0'a sahip olmanız ve sizinkinin sadece bir tane (şimdi iki) olduğu zaman İnanmak istediğim bir şey. - Pryftan
@Mene söyleniyor -iname büyük / küçük harfe duyarlıdır, bu da örneğin TxT ve TXt gibi .TXT dosyalarını da bulacaktır. - Pryftan


Eğer senin grep yinelemeli aramayı desteklemez, birleştirebilirsiniz find ile xargs:

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

Bunu hatırlamak için formatı daha kolay buluyorum find -exec.

Bu, dosya adının ve eşleşen hattın içeriğinin, örn.

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

Eklemek isteyebileceğiniz isteğe bağlı bayraklar grep:

  • -i - büyük / küçük harfe duyarlı arama
  • -l - Sadece eşleşmenin bulunduğu dosya adını çıkar
  • -h - Sadece eşleşen dosya (sadece dosya adı değil) çıktı

47
2018-06-20 08:49



Bu eşdeğerdir grep 'text-to-find-here' dosya adı olmadan find hiçbir şey bulamıyor. Bu kullanıcı girişi için asılacak ve bekleyecektir! Eklemek --no-run-if-empty bir seçenek olarak xargs. - hagello
Dosya ve dizin adları boşluk içeriyorsa (xargs'ın ayırıcılar olarak yorumladığı karakterler) bu bulma ve xargs birleşimi amaçlandığı gibi çalışmaz. kullanım find … -exec grep … +. Xargs ile birlikte bulmakta ısrar ederseniz, -print0 ve -0. - hagello


grep -insr "pattern" *
  • i: Hem PATTERN hem de giriş dosyalarındaki büyük harf ayrımlarını yoksayın.
  • n: Giriş dosyasındaki 1-temelli satır numarası ile her çıktı satırını önek.
  • s: Varolmayan veya okunamayan dosyalarla ilgili hata mesajlarını bastır.
  • r: Her dizinin altındaki tüm dosyaları yinelemeli olarak okuyun.

34
2018-02-26 05:47



Cevabınızın diğer cevaplar üzerinde nasıl ya da onlardan yeterince farklı olduğunu nasıl geliştirdiğini açıklayabilir misiniz? - Amos M. Carpenter
hatırlamak için çok karmaşık değil, tüm kalıpları kapsayacak (vaka-senstivity -> kapalı, dosya isimleri ve satır numarası içerir ve yinelemeli arama yapmak vb) ve sonunda "*" kullanarak tüm dizinlerde arama (herhangi bir belirtmek gerek yok yol veya dizin adı). - enfinet
Üzgünüm, daha açık olmalıydım: eğer bu açıklamayı cevabınıza dahil ederseniz harika olurdu. Zaten, diğer birçok benzer cevapta olduğu gibi, bu kadar kısa bir cevaptan, denemenin yararını görmek zor. o kabul edilen cevap üzerinde veya aşağı çekilmekte olanlardan biri olacaktır. - Amos M. Carpenter
Bu iyi bir cevap + iyi bir açıklama - khelili miliana
@ AmosM.Carpenter Bu cevabı sevdiğim bir şey, aslında istediğimiz sonuçları elde etmek için önemli olmayan gürültüyü filtrelemeye yardımcı olan bastırma argümanını işaret ediyor. Grep, bazı "dosyalar" üzerinde "İşlev uygulanmadı", "Geçersiz Bağımsız Değişken", "Kaynak kullanılamıyor" vb. Gibi hataları yazdırır. - leetNightshade