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


5257

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

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

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

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

Bu, bunu yapmanın doğru yoluna yakın mı? Değilse, nasıl yapmalıyım? Dosyalarda metin dizeleri bulma yeteneği yaptığım bazı programlama projeleri için olağanüstü yararlı olacaktır.


21
grep'in herhangi birini .tek karakterli joker karakter olarak yorumlayacağını unutmayın . Benim tavsiyem daima fgrep veya egrep kullanmaktır.
Walter Tross

10
Neyse, neredeyse oradaydın! Sadece değiştirmek -Hile -l(ve belki grepbirlikte fgrep). Belirli ad kalıplarına sahip dosyaları hariç tutmak findiçin daha gelişmiş bir şekilde kullanırsınız. Yine de kullanmayı öğrenmeye değer find. Sadece man find.
Walter Tross

6
find … -exec <cmd> +yazmak daha kolay ve daha hızlı find … -exec <cmd> \;. Yalnızca <cmd>herhangi bir sayıda dosya adı bağımsız değişkeni kabul ederse çalışır . <cmd>Python veya Ruby komut dosyaları gibi yavaş başlıyorsa , yürütme süresindeki tasarruf özellikle büyüktür .
hagello

Belirli bir yolda özyinelemeli olarak arama yapmak için komut `grep --include = *. Txt -snw" paterni "thepath / * şeklindedir.
Stéphane Laurent

@ StéphaneLaurent Bence bunu çok fazla karmaşıklaştırıyorsunuz. Sadece söylegrep "pattern" path/*.txt
fedorqui 'SO

Yanıtlar:


9518

Aşağıdakileri yapın:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -rveya -Rözyinelemeli,
  • -n satır numarası ve
  • -w tüm kelimenin eşleşmesi anlamına gelir.
  • -l (küçük harf L) yalnızca eşleşen dosyaların dosya adını vermek için eklenebilir.

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

  • Bu yalnızca .c veya .h uzantılarına sahip dosyalar arasında arama yapar:

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

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Dizinler için belirli bir dizini / dizinleri --exclude-dirparametre aracılığıyla hariç tutmak mümkündür . Örneğin, bu dir1 /, dir2 / dizinlerini ve * .dst / ile eşleşen tüm komutları hariç tutar:

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

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

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


74
--exclude kullanın. "grep -rnw --exclude = *. o 'dizin' -e" desen "gibi
rakib_

98
dikkat çekicidir: rseçenek tembel görünüyor (ilk dizinden sonra durmaktan önce derinlik ilkini geçiyor), Raçgözlü (tüm ağacı doğru bir şekilde geçecek).
Eliran Malka

5
grep -rnw "Aradığım dize" ihtiyacım olanı yaptı. Teşekkürler!
ViliusK

33
Not (özellikle yeni başlayanlar için): Yukarıdaki komuttaki tırnak işaretleri önemlidir.
madD7

69
@Eliran Malka Rtr rher iki dizini de doğru bir şekilde gezecek , ancak Rsembolik bağlantıları takip edecek.
bzeaman

1498

Şunları kullanabilirsiniz grep -ilR:

grep -Ril "text-to-find-here" /
  • i yoksayma durumunu belirtir (sizin durumunuzda isteğe bağlıdır).
  • R yinelemeli anlamına gelir.
  • l "sonucun kendisini değil dosya adını göster" anlamına gelir.
  • / makinenizin kökünden başlamak anlamına gelir.

85
Deneyimlerime dayanarak, -içok yavaşlatır, bu yüzden gerekli değilse kullanmayın. Belli bir yönde test edin ve genelleştirin. Birkaç dakika içinde tamamlanmalıdır. Bence düzenli bir ifade onu yavaşlatır. Ama yorumlarım varsayımlara dayanıyor, bunu timeçizginin önünde test etmenizi öneririm .
fedorqui 'SO

4
Evet /*. Her neyse, sadece test ettim ve sadece /işe yaradığını fark ettim .
fedorqui 'SO

10
Normal ifade kullanarak arama yapmıyorsanız, çoğu sistemde grep yerine fgrep kullanabilirsiniz.
markle976

8
Evet @ markle976, adam grep gelen aslında: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
fedorqui 'SO' zarar vermeyi durdurun '30

17
/ Dizinini dizin grep -Ril "text-to-find-here" ~/sites/veya kullanım yolu ile değiştirebilirsiniz . güncel dizin içingrep -Ril "text-to-find-here" .
Black

329

Ack kullanabilirsiniz . Kaynak kodu için grep gibidir . Tüm dosya sisteminizi bununla tarayabilirsiniz.

Sadece yap:

ack 'text-to-find-here'

Kök dizininizde.

Ayrıca normal ifadeler kullanabilir, dosya türünü belirtebilir, vb.


GÜNCELLEME

Ack benzeri ama bundan 3-5 kat daha hızlı olan ve hatta bir dosyadaki desenleri görmezden gelen The Silver Searcher'ı keşfettim .gitignore.


57
Çok kullanışlı, basit ve hızlı. Uyarı: "Debian kaynaklı dağıtımlarda ack" ack-grep "olarak paketlenmiştir, çünkü" ack "zaten var" ( beyondgrep.com/install dizininden ). Bu Linux'larda bir Kanji kod dönüştürücüsü çalıştırabilirsiniz ...
Jose_GD

11
ack veya ack-grep'in güzel golleri var, ancak uygun kullanıldığında + grep'i bulun performansında çok daha iyi
Sławomir Lenart

14
Ripgrep'in The Silver Searcher ve plain 'ol grep dahil olmak üzere burada belirtilenlerden daha hızlı olduğunu unutmayın . Kanıt için bu blog yayınına bakın .
Radon Rosborough

194

Kullanabilirsiniz:

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

rBöylece özyinelemeli ve ayrıca alt dizinleri belirtilen yolda aramaya başlar ve simgeler. Bu size dosya adını söyleyecek ve dosyadaki dizenin göründüğü satırı yazdıracaktır.

Veya tüm javascript dosyalarında (* .js) arama yapmaya çalıştığınıza benzer bir komut (ö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, bunu da yazabiliriz: grep -rn "Aranacak dize" / yol / to / dizin / veya / dosya -r: özyinelemeli arama n: eşleşmeler için satır numarası gösterilir


1
Bulma sürümü için teşekkürler. Benim grep sürümü (NAS için busybox) -r seçeneği yok, gerçekten başka bir çözüme ihtiyacım var!
jc

3
'Bul' sürümü için teşekkür ederiz! ' .Js' veya ' .txt', vb. İle filtreleme yapabilmek çok önemlidir . Hiç kimse, komutun bile olsa, grep'in son aile tatilindeki tüm çok gigabaytlık videoları aramayı bitirmesini beklemek için saatler harcamak istemez. yazmak daha kolay.
mightypile

kabul edilen sürümden daha iyi grep, çünkü kabul edilen yarım kelimeleri
aramayın

114

Bunu kullanabilirsiniz:

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

12
en kolay, ayrıntılı, özyinelemeli ve büyük / küçük harfe duyarsız. başparmak havaya.
Francesco Casula

-A3 eklerseniz daha iyi
albanx

73

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

Her şeyden önce, -Hyerine kullandığınıza inanıyorum -l. Ayrıca, içine tırnak içine metin eklemek için deneyebilirsiniz {} \.

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

Misal

Dizininizde belirli bir "Apache Lisansı" metni içeren dosyaları aradığınızı varsayalım. Aşağıdakilere benzer sonuçlar gösterecektir (çıktı, dizin içeriğinize göre 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 / küçük harfe duyarlılığı kaldırın

"Metin" ve "METİN" gibi durum hakkında kullanılmasanız bile, durumu -iyok saymak için anahtarı kullanabilirsiniz . Daha fazla bilgiyi buradan okuyabilirsiniz .

Umarım bu size yardımcı olur.


2
Bu komutun yaptığı şey: findbulduğu tüm yolları komuta iletir grep -l "text-to-find-here" <file found>". Dosya adına kısıtlamalar ekleyebilirsiniz, örneğin find / -iname "*.txt"yalnızca adın bittiği dosyalarda arama yapmak için.txt
Mene

1
@ Yardımcı - okuyucular için herhangi bir karışıklığı önlemek için bir örnek çıktı dahil.
lkamal

2
@Mene Yardımcı'nın yorumunun sizinkinden daha fazla oy alması gerçekten üzücü bir durum ... yorumları 2014'ten ve sizinki 2017 olsa bile, tam olarak 0 olması ve sadece bir tane (şimdi iki) olması durumunda yorumlarının 6 olması bile inanmak istediğim bir şey değil.
Pryftan

@Mene Bu, -inamebüyük / küçük harf duyarsızdır, yani .TXT dosyalarını, ayrıca TxT ve TXt vb.
Pryftan

66

grep( GNU veya BSD )

grepGeçerli klasörü özyinelemeli olarak aramak için aracı kullanabilirsiniz , örneğin:

grep -r "class foo" .

Not: -r- Alt dizinleri özyinelemeli olarak arayın.

Ayrıca, aşağıdaki gibi belirli dosyalarda arama yapmak için globbing sözdizimini kullanabilirsiniz:

grep "class foo" **/*.c

Not: Globbing seçeneğini ( **) kullanarak , tüm dosyaları belirli bir uzantı veya desenle özyinelemeli olarak tarar. Bu sözdizimi etkinleştirmek için çalıştırın: shopt -s globstar. **/*.*Tüm dosyalar (gizli ve uzantısız hariç) veya başka bir desen için de kullanabilirsiniz .

Argümanınızın çok uzun olduğu hatasındaysanız, aramanızı daraltmayı düşünün veya findbunun gibi bir sözdizimi kullanın:

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

Alternatif olarak kullanın ripgrep.

ripgrep

Daha büyük projeler veya büyük dosyalar üzerinde çalışıyorsanız ripgrep, aşağıdaki gibi kullanmalısınız :

rg "class foo" .

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

Bu çok daha hızlı gibi başka bir araç daha var GNU / BSD grep , ucg, ag, sift, ack, ptbunun üzerine kurulmuş olduğundan, ya da benzer Rust en regex motoru çok hızlı arama yapmak için, SIMD ve saldırgan edebi optimizasyonlar sonlu otomata kullanır.

.gitignoreDosyalarda belirtilen desenleri yoksaymayı destekler , böylece tek bir dosya yolu aynı anda birden fazla glob deseniyle eşleştirilebilir.


Aşağıdaki gibi ortak parametreleri kullanabilirsiniz:

  • -i - Duyarsız arama.
  • -I - İkili dosyaları yok sayın.
  • -w - Tüm kelimeleri arayın (kısmi kelime eşlemenin tersi).
  • -n - Maçınızın çizgisini gösterin.
  • -C/ --context(örn. -C5) - Bağlamı artırır, böylece çevredeki kodu 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. İle birleştirilebilir -H.

1
Ayrıca genişletilmiş globbing'i yararlı buluyorum. Ancak, çok fazla sayıda dosya varsa, "Bağımsız değişken listesi çok uzun" hatası alabileceğinizi unutmayın. (Basit globbing de bu tür hatalara eğilimlidir).
Yoory N.30

2
Bir dosya sisteminin tamamını solumak için, rg neredeyse diğer araçlardan çok daha az acı verici olacaktır.
lk

55

Eğer senin grepözyinelemeli arama desteklemez, sen birleştirebilirsiniz findile xargs:

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

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

Bu, eşleşen satırın dosya adını ve içeriğini çıkarır;

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

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

  • -i - büyük / küçük harfe duyarlı olmayan arama
  • -l - yalnızca eşleşmenin bulunduğu dosya adını çıktılar
  • -h - yalnızca eşleşen satırı çıktılar (dosya adı değil)

3
Bu, hiçbir şey bulamazsa grep 'text-to-find-here'dosya adı olmadan eşdeğerdir find. Bu askıda kalacak ve kullanıcı girişini bekleyecektir! İçin --no-run-if-emptyseçenek olarak ekleyin xargs.
hagello

3
Dosya veya dizin adları boşluk içeriyorsa (xargs ayırıcı olarak yorumladığı karakterler) bu find ve xargs birleşimi amaçlandığı gibi çalışmaz. Kullanın find … -exec grep … +. Eğer Xargs birlikte find kullanmakta ısrar ederse, kullanımı -print0ve -0.
hagello

43
grep -insr "pattern" *
  • i: PATTERN ve girdi dosyalarındaki büyük / küçük harf ayrımlarını yoksay.
  • n: Çıktının her satırına, girdi dosyasındaki 1 tabanlı satır numarası ile önek ekleyin.
  • s: Varolmayan veya okunamayan dosyalar hakkındaki hata mesajlarını bastırın.
  • r: Her dizinin altındaki tüm dosyaları özyinelemeli olarak okuyun.

3
Cevabınızın diğer cevaplar üzerinde nasıl geliştiğini ya da cevapların onlardan ne kadar farklı olduğunu açıklayabilir misiniz?
Amos M. Carpenter

hatırlanması çok karmaşık değil, tüm desenleri kapsayacak (büyük-küçük harf duyarlılığı -> kapalı, dosya adları ve satır numarası içerir ve özyinelemeli arama yapar vb.) ve sonunda "*" kullanmak tüm dizinleri arayacaktır (herhangi bir belirtmeye gerek yok) yol veya dizin adı).
enfinet

Maalesef daha net olmalıydım: Bu açıklamayı cevabınıza ekleyebilmeniz harika olurdu. Zaten özellikle pek çok diğer benzer cevaplarla, olduğu haliyle, çalışmakla yararı nedir bu kadar kısa bir cevap görmek zordur bunu kabul cevap veya upvoted olanlardan birinin üzerine olurdu.
Amos M. Carpenter

6
@ AmosM.Carpenter Bu cevap hakkında sevdiğim bir şey, aslında istediğimiz sonuçları elde etmenin önemi olmayan gürültüyü filtrelemeye yardımcı olabilecek baskılama argümanını işaret etmektir. Grep, belirli "dosyalarda" "İşlev uygulanmadı", "Geçersiz Bağımsız Değişken", "Kaynak kullanılamıyor" vb. Hataları yazdırır.
leetNightshade

@ leetNightshade: Yorumunuzu bana hitap ettiğinizi varsayıyorum çünkü seyrek orijinal yayında bir açıklama istedim. Önceki açıklamalarımın anlamlı olması için lütfen Fabio'nun büyük revizyonuna bakın.
Amos M. Carpenter

39

Silversearcher adında yeni bir yardımcı program var

sudo apt install silversearcher-ag

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

Sadece kullanabilirsiniz

ag "Search query"

Ve bu sizin için görev yapacak!


35

Linux'ta belirli metin 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' {} \;


Örneğinizde find işlevini kullanıyorsanız ve tarafından verilen birçok İzin reddedilen iletiden kaçınmak için komutun sonuna ve sonuna daha iyi -s( --no-messages) ekleyin ve :grep2>/dev/nullgrepfind

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

find , Unix benzeri platformlarda belirli metin ararken grep ile birlikte dosyaları aramak için kullanılan standart araçtır. Bul komutu genellikle ile birleştirilir Xargs arada,.

Aynı amaç için daha hızlı ve daha kolay araçlar mevcuttur - aşağıya bakın. Tabii ki platformunuzda mevcut olmaları şartıyla daha iyi deneyin :

Daha hızlı ve daha kolay alternatifler

RipGrep - en hızlı arama aracı:

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

Gümüş Arayıcı :

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

ack :

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

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


Uyarı : Gerçekten bundan kaçınamıyorsanız, uzun ve verimsiz bir arama yapmaktan kaçınmak için '/' (kök dizin) ' den arama yapmayın ! Yukarıdaki örneklerde, ' / ' ifadesini alt dizin adıyla değiştirmeniz daha iyi olur , örneğin, gerçekten aramak istediğiniz yere bağlı olarak "/ home" ...


'find, Unix benzeri platformlarda belirli metin içeren dosyaları aramak için standart bir araçtır' benim için oldukça belirsiz görünüyor. Özyinelemenin yanı sıra grep find, dosyaların içinde doğrudan metin aramaz. Ve belki de bu ek araçlar bazı eski zamanlayıcılar için yararlıdır ve örneğin alışmaya alışkın olanlar grep, onlara hiçbir zaman vermeyecektir (kesinlikle kesinlikle yapmayacağım). Yine de işe yaramaz olduklarını söylemiyorum.
Pryftan

".... belirli bir metin içeriyor ...": cümlenin bu kısmı doğru değildi (çünkü aramanın bu kısmı ile ilgilenen kendisini bulamıyor). Düzenlenen. Teşekkürler.
Bludzee

Yardım etmekten memnun oldum! Çok çok hızlı bakışta başka tek şey kelime değişiyor klasörü için dizine ama bu tamamen asla kazanamayacak benim bir haçlı seferi olduğunu biliyorum. Gerçi
vazgeçmiyor

Neden "klasör" yerine "dizin" değil, neden? Lütfen "haçlı seferi" paylaşın!
Bludzee

Bunun yerine dizin kullan diyorum! Atıfta bulunulursa, '/' yerine bir alt klasör adı yazmanız daha iyi olur ve bu benim bir evcil hayvanımdır. Ah ... belki anladın. Neden? Çünkü buna böyle denir. Buna dosya sistemi düzeyinde de denir. Ve şu şekilde bakın: (DOS için) hiç çağrıldı folmı? Hayır tabii değil; çağrıldı dir(ve hala olduğuna inanıyorum). Klasör (sanırım) kullanıcı dostu için bir şeydir, ancak bu durumda belki daha az 'gelişmiş' kullanıcılar için onu daldırma?
Pryftan 0:15

29

Deneyin:

find . -name "*.txt" | xargs grep -i "text_pattern"

5
Bu aslında ne zaman böyle KULLANILMAMASININ en iyi örneğidir xargs.. bunu düşünün. 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. xargsBurada YANLIŞ dosyasını eşleşti ve amaçlanan dosyayı eşleşmedi. Ya kullanın find .. -print0 | xargs -0 ...ama bu bir borunun işe yaramaz ya da daha iyisifind ... -exec grep ... {} +
shalomb

29

pwdBulunduğunuz herhangi bir dizinden aşağı doğru yinelenen arama yapmak için kullanın

grep -rnw `pwd` -e "pattern"

Güncelleme Kullandığınız grep sürümüne bağlı olarak atlayabilirsiniz pwd. Yeni sürümlerde .hiçbir dizin verilmezse grep için varsayılan durum gibi görünmektedir:

grep -rnw -e "pattern"

veya

grep -rnw "pattern"

yukarıdaki ile aynı şeyi yapacak!


3
pwdvarsayılan olarak kullanıldığından , kullanımı hiç gerekli değildir. grep -rnw "pattern"yeterli.
fedorqui 'SO

ve aslında grep -rnwve benzerleri üç yıl önce cevaplanan şey, bu cevabın nasıl değer kattığını anlamıyorum.
fedorqui 'SO

Seçilen cevap varsayılan kalıbı göstermiyor ve 5 halkın yararlı bulduğu görülüyor
mahatmanich

"Varsayılan kalıp" ile ne demek istiyorsun? Kabul edilen cevap, grep -rnw '/path/to/somewhere/' -e "pattern"burada olanı içerir . 2,3 milyon ziyaretten sonra 5 oy o kadar da önemli değil.
fedorqui 'SO

Kabul ediyorum :-) Orijinal cevapta eksik olan şey, hiç bir yol vermek veya geçerli dizinde özyineli olarak kabul edilen cevapta yansıtılmayan bir arama yapmak zorunda olmadığınız kullanım durumudur. Bu yüzden grep hakkında biraz daha derinlere inmek iyi bir öğrenme deneyimiydi.
mahatmanich

19

grep dize aramasak bile kullanılabilir.

Basitçe,

grep -RIl "" .

tüm metin dosyalarının yolunu, örneğin yalnızca yazdırılabilir karakterler içerenleri yazdırır.


2
Bunun sadece lsveya find(özyinelemeli) kullanmaktan daha iyi olduğunu görmüyorum
fedorqui 'SO'

17

Dosya aramak için kullanılabilecek birkaç komut listesi aşağıdadır.

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

5
mevcut cevaplara ne ekliyor?
fedorqui 'SO

@fedorqui'ye egrepeşdeğerdir grep -Eve bu, --extended-regexpayrıntıları burada bulabileceğiniz anlamına gelir unix.stackexchange.com/a/17951/196072
omerhakanbilici


15
find /path -type f -exec grep -l "string" {} \;

Yorumlardan açıklama

find, belirli bir yolun alt dizinlerindeki dosyaları ve dizinler ve bağlantılar gibi diğer nesneleri bulmanızı sağlayan bir komuttur. 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

15

Deneyin:

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

tüm dosya sistemlerini arayacaktır, çünkü /kök olduğu için .

Ana 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' {} \;

Belki de klasörlerin farklılıklarıyla ilgili detaylar birçok kişi için açıktır ... ama aynı zamanda yeni başlayanlar için çok yararlıdır. +1
nilon

1
mevcut cevaplara ne ekliyor?
fedorqui 'SO

Buna Haçlı Seferim diyorum ama kelime 'dizin'. Bu Windows değil (zaten 'dizin' kullanılan zaten - 9x öncesi). Lütfen 'klasör' demeyi bırakın. Son komuta gelince, '/' sadece FYI'ye bile ihtiyacınız yok.
Pryftan

15

Umarım bu yardımcı olur ...

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

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 .pasVEYA .dfmdosyaları:

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. .içinde findgeçerli dizinden belirttiği.
  2. -name" *.*": tüm dosyalar için (-name " *.pas" -o -name " *.dfm"): Yalnızca *.pasOR *.dfmdosyaları, VEYA-o
  3. -type f dosya aradığını belirtir
  4. -print0ve --nulldiğer tarafında |(boru) ile ilgili dosya adı geçen önemli olanlar findiçin grepgömülü xargsbir dize olarak yolunu ve dosya adını tedavisinde grep sağlayan, dosya içinde boşluklu dosya isimleri geçmesiyle sağlayan, ve her bir alandan ayırmayın.

-name '*.*'söylediğin şey değil; desen buna eşit olmadığı için 'dosya' adlı bir dosyadan alınmaz (.ext); *Ancak (dosyaları kenara). Ama başka bir şey daha var: tüm dosyaları istiyorsanız neden ilk etapta bir dosya adı belirtmeye çalışıyorsunuz? Başka bir yorum yok - dışında hala MS terminolojisi 'klasörü' kullanmayan insanlar olduğunu bilmek güzel (ki gerçekten yeterli söyledikten sonra eklemek olmaz ama yaptığınız biraz yanlış ifadeye işaret etmek istedim) dosya isimleriyle - ve 'hepsi' durumunda artıklık / yararsızlık ile).
Pryftan

15

Basit bir findkullanışlı çalışabilir. ~/.bashrcdosyanızda diğer ad :

alias ffind find / -type f | xargs grep

Yeni bir terminal başlatın ve sorun:

ffind 'text-to-find-here'

14

Benzer bir şey yapan bir Python betiği yazdım . Bu betiği böyle kullanmalısınız.

./sniff.py path pattern_to_search [file_pattern]

İlk argüman,, pathözyinelemeli olarak arayacağımız dizindir. İkinci argüman,, pattern_to_searchbir dosyada aramak istediğimiz normal bir ifadedir. Python re kütüphanesinde tanımlanan normal ifade formatını kullanıyoruz . Bu komut dosyasında, .yeni satırla da eşleşir.

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

Ben uzantılı Python dosyaları aramak istiyorsanız Örneğin, pyiçeren Pool(kelime izledi Adaptor, ben şunu yapın

./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 

Ve voila, 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 eklenir.


14

Kesinlikle kullanmak istiyorsanız findkullanın find + grep:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

adımlar:

1. finddosyaları aramak için kullanın, 2. sonra hepsinde
yürütün grep.

Bu size finddosya bulma gücü verebilir .

  • Yalnızca belirli dosyalara erişmek -name Patternistiyorsanız kullanın grep:

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

Onunla oynayabilir ve finddosya aramanızı geliştirmek veya daraltmak için farklı seçenekler kullanabilirsiniz .


Fark ne? Dosya yolundaki boşluklarla çalışır mı?
Peter Mortensen

13

kullanın:

grep -c Your_Pattern *

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


13

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

grep -r <text_fo_find> <directory>

Bulmak istediğiniz metnin büyüklüğünü önemsemiyorsanız, şunu kullanın:

grep -ir <text_to_find> <directory>

Benim durumumda ben dizini belirtmek bile her yerde arama gibi görünüyor
Pathros

@Pathros Muhtemelen özyineleme etkin ve belirttiğiniz dizinde yapmak. Başka bir deyişle, özyineleme işleri bu şekilde değiştirir.
Pryftan

@Pathros Oh ve eğer -arama dizgisinde s varsa --ilk önce grep'e geçmek istersiniz ; aksi takdirde ilginç yan etkilere neden olabilir!
Pryftan 0:25

13

Ben grep 'rl' ile ne kadar basit yapar hayran :

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

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

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

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

Mükemmel çalışır ...


Bu, Git Bash'te (Windows) da çalışır .
Peter Mortensen

Ancak her dosyanın aranması gerektiği anlamına gelir (dosya adı veya dosya uzantısı düzeyinde filtre yok .txt). Yoksa bunu yapmanın bir yolu var mı?
Peter Mortensen

12

Dizeyi aramak ve yalnızca arama dizesiyle o satırı çıkarmak için:

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

Örneğin:

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

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

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;

Örneğin:

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

1
Ben find … -exec grep 'str' {} \;(hiç kullanmak zorunda) kullanarak karşılaştırıldığında sadece olumsuz görüyorum find.
phk

1
Bu, findboşluklar tarafından bulunan dosyalardan herhangi birinin bulunması durumunda korkunç bir şekilde kırılacaktır .. greppingyanlış dosyaları bitirebilir ve / veya doğru dosyaları tamamen eksik olabilirsiniz. Sadece kullanmanız find ... -exec grep ...gerekiyorsa kullanın find.. ama bu durumda grep -r ...yeterli.
shalomb

1
sonra grep için find sonuçları üzerinde bir döngü kullanmanın anlamı nedir? Bu gereksiz yere karmaşık hale geliyor.
fedorqui 'SO

12

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

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

ack -i search_string folder_path/*

Büyük / -iküçük harfe duyarlı arama için yok sayabilirsiniz


2
Bu mevcut cevaplara ne katıyor? Bu, üç yıldan fazla bir süre önce önerildi.
fedorqui 'SO

1
@fedorqui 1) boru yok! 2) Düzenli ifadeler kullanın 3) Aramadan sonra düzenleme için yararlı olan satır numaralarını, dosya adını göreceli yolla, vurgulanmış metni vb. Alın. Arama klasörü ve alt klasörlerim altındaki "include" veya "hpp" anahtar kelimelerini arayan "ack include \ | hpp" komutunun çıktısına bakın. Umarım konu açıktır. Örnek çıktı (Anahtar kelime vurguları basit metinle gösterilemiyor) process / child.hpp 11: boost / process / child.hpp process / all.hpp 21: #include <boost / process / execute.hpp>
Pal

12

Önceki tüm yanıtlar grep and find'ı önermektedir. Ama başka bir yol daha var: Midnight Commander

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


ranger aynı fikirde olurdu
nilon

11

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

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

2
findve sonra kullanmanın anlamı grep -rnedir? Aynı şey için tasarlanmıştır, bu yüzden bu gereksizdir.
fedorqui 'SO' zarar vermeyi durdurun

ohh !! düzeltildi, Aslında bulmak filtrelenmiş dosyaları üzerinde grep çalıştırmak için ve hepsi değil, teşekkürler
Pradeep Goswami

2
yine de, bu bir anlam ifade etmiyor, filtreleyebilirsiniz find.
fedorqui 'SO'

11

Zorluktan kaçının ve ack-grep'i takın. Birçok izin ve tırnak 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"
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.