Bir klasörün içindeki bir kelimeyi bulmak için grep'i nasıl kullanabilirim?


542

Windows'da, bir klasörün içindeki bir kelimeyi bulmak için bir arama yapardım. Benzer şekilde, birçok alt dizin ve dosya içeren bir dizin içinde belirli bir kelimenin olup olmadığını bilmek istiyorum. Grep sözdizimi için yaptığım aramalarda dosya adını belirtmeliyim, yani grep string filename.

Şimdi dosya adını bilmiyorum, ne yapmalıyım? Bir arkadaşım yapmayı önerdi grep -nr string, ama bunun ne anlama geldiğini bilmiyorum ve onunla hiçbir sonuç almadım (a yayınlayana kadar cevap yok ctrl + c).

Yanıtlar:


848
grep -nr 'yourString*' .

Sondaki nokta geçerli dizini arar. Her parametrenin anlamı:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Bulmak istiyorsunuz MobileAppServlet.javaya MobileAppServlet.classya MobileAppServlet.txt; 'MobileAppASer*.*'aynı şeyi yapmak için başka bir yol.)

Daha fazla parametreyi kontrol etmek için man grep komutunu kullanın.


14
Ne işi var *? Kabuk joker karakter genişlemesi ile sonuçlanır (joker desenle eşleşen dosya adları varsa) veya grep, önceki karakter için 0 veya daha fazla tekrarlama operatörü olarak kabul eder *.
usta

7
Şimdi için en bunlara olanak düşünelim grep -nr MobileAppSer* .1. biz geçerli dizin eşleştirme 3 dosyaları var varsayalım MobileAppSer*Joker desen: adlandırılmış MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Sonra grepşu şekilde çağrılacaktır:grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt . . MobileAppServlet.java, MobileAppServlet.txt dosyalarında ve geçerli dizinde başka bir yerde "MobileAppServlet.class" metnini aramak anlamına gelir - bu kesinlikle kullanıcının burada istediği şey değildir.
usta

7
2. Geçerli dizinde MobileAppSer*joker desenle eşleşen dosya yoksa grep, bağımsız değişkeni MobileAppSer*olduğu gibi alır ve bu nedenle "MobileAppSe" metnini ve ardından 0 veya daha fazla "r" örneğini aramasını alır. geçerli dizinin dosya içeriklerinde "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", vb. metinleri bulmaya çalışın - kullanıcının istediği şeyi değil.
usta

5
Bu şüpheli bir regex seçimidir. Usta buna dikkat çekti.
kindasimple

117
grep -nr string my_directory

Ek notlar: bu, sözdizimini tatmin eder, grep [options] string filenameçünkü Unix benzeri sistemlerde, bir dizin bir tür dosyadır (özellikle Windows'ta sadece "dosyalar" olarak adlandırılan varlıkları ifade etmek için "normal dosya" terimi vardır).

grep -nr string standart girdiden aramak için içeriği okur, bu yüzden sadece sizden girdi bekler ve ^ C tuşuna bastığınızda bunu durdurur (ayrıca, D'nin sonu için anahtar kombinasyonu olan ^ D'de de durur) -dosya).


1
Hey, eğer durumdan bağımsız olarak bir dize aramak istiyorsanız, bunu yapmalıyım: grep -i -nr "my word".
kiki

2
@kiki: Evet, eşdeğergrep -inr "my word" .
usta

16
@kiki: -rfor grep, alt dizinlerde özyinelemeli olarak arama yapmak ve -nher çıktı satırına o satırı içeren dosyanın karşılık gelen satır numarası ile önek demek anlamına gelir. man greptüm bunları ve daha fazlasını anlatıyor.
usta

62

GREP : Global Düzenli İfade Baskısı / Ayrıştırıcı / İşlemci / Program.
Geçerli dizinde arama yapmak için bunu kullanabilirsiniz.
Programın tüm alt klasörlerde ve alt klasörlerinde ve alt klasörlerinin alt klasörlerinde vb. Arama yaptığı anlamına gelen "özyinelemeli" için -R belirtebilirsiniz.

grep -R "your word" .

-ndosyayla eşleşen satır numarasını yazdırır.
-ibüyük / küçük harfe duyarsız (büyük / büyük olmayan harfler) arar.

grep -inR "your regex pattern" .

3
./* geçerli dizindeki tüm dosyalar, -R özyinelemeli (alt dizinleri arama vb.) anlamına gelir.
Stefan Steiger

25
grep -nr search_string search_dir

arama_dizesi için bir RECURSIVE (dizin ve tüm alt dizinleri anlamına gelir) araması yapar. (usta tarafından doğru cevaplandığı gibi).

Arkadaşınızın önerisiyle herhangi bir cevap almamanızın nedeni:

grep -nr string

hiçbir dizin belirtilmedi. Aramayı yapmak istediğiniz dizindeyseniz aşağıdakileri yapmanız gerekir:

grep -nr string .

"." İfadesini dahil etmek önemlidir. grep'e BU dizini aramasını söyler.


Merhaba, aralarında boşluk olan 2 kelimeyi aramak zorunda kalırsam ne yapmalıyım? Kelimeler tırnak içinde belirtilmelidir mi? yani grep -nr "benim sözüm".
kiki

24

Ayrıca:

find directory_name -type f -print0 | xargs -0 grep -li word

ama bu yeni başlayanlar için biraz fazla olabilir.

findgenel amaçlı bir dizin yürüteç / lister, -type f"dizinler ve adlandırılmış yöneltmeler yerine düz dosyaları arayın ve neye sahip olduğunuzu", -print0"sınırlayıcı olarak boş karakterler kullanarak bunları standart çıktıya yazdırmak " anlamına gelir. 'Den çıktı findgönderilir xargs -0ve bir kayıt ayırıcı olarak (standart satırsonu yerine) boş karakterleri kullanarak yığınlar halinde standart girdisini alır (komut satırı uzunluğu sınırlamalarını önlemek için) ve grep -li wordher dosya kümesi için geçerlidir . Açık grep, -laraçlar "dosyalarına listesinde bu maçı" ve -iaraçlar "harf duyarsız"; genellikle tek karakter seçeneklerini birleştirebilirsiniz, böylece -lidaha sık görürsünüz -l -i.

Eğer kullanmıyorsanız -print0ve -0daha sonra bunları kullanarak iyi bir alışkanlıktır böylece boşluk içeren dosya adları ile sorunlarla edeceğiz.


1
@mmmshuddup: Teşekkürler. Özellikle yeni başlayanlarla çalışırken cevabın bir parçası olarak bir açıklama yapmazsam kendimi kötü hissediyorum.
mu

1
Bu sitede en çok takdir ettiğim şey bu. Hepimizin bir kez yeni başlayan olduğumuzu ve teknoloji dünyasına gelmenin kolay olmadığını hatırlamak önemlidir!
Evet Barry

dizinleri hariç tutabilir miyim? @muistooshort
Ferologlar

@Ferologics Desteklediğiniz man findseçenekleri görmek için komut satırından kontrol edin find.
mu çok kısa

8

Alt dizinlerdeki tüm örnekleri bulmak için neden yinelemeli arama yapmıyorsunuz:

grep -r 'text' *

Bu bir cazibe gibi çalışır.


1
Boşluk gibi özel karakterleri olmayan arama dizesini alıntılamaya gerek yok
Scott Stensland

5
  1. grep -r "yourstring" * Herhangi bir dosya ve klasörde "dizginizi" bulur

Şimdi aynı anda iki farklı dizeyi aramak istiyorsanız, her zaman E seçeneğini kullanabilir ve arama için kelimeler ekleyebilirsiniz. aradan sonra örnek

  1. grep -rE "yourstring|yourotherstring|$" *yourstringveya yourotherstringeşleştiği liste konumlarını arayacaktır

4

Kullanmak istediğim başka bir seçenek:

find folder_name -type f -exec grep your_text  {} \;

-type f size klasörleri değil, yalnızca dosyaları döndürür

-exec ve {} aramada bulunan dosyalarda grep komutunu çalıştırır (tam sözdizimi "-exec komutu {}").


4
grep -R "string" /directory/

-R, -r yapmadığında da sembolik bağları takip eder.


2

Seçtiğiniz cevap iyi ve işe yarıyor, ancak bunu yapmanın doğru yolu değil, çünkü:

grep -nr yourString* .

Bu aslında dizeyi arar "yourStrin"ve "g"0 veya daha fazla kez.

Yani bunu yapmanın uygun yolu:

grep -nr \w*yourString\w* .

Bu komut, geçerli klasörde önce ve sonra herhangi bir karakterle dizeyi arar.


2
Bununla birlikte , hattın herhangi bir yerinde grep -nr yourStringçıplak olarak göründüğü gibi yourString(veya en azından sistemimde, OSX Lion'da da) görünüyor
theheadofabroom

1

@ELRuLL tarafından gönderilen yanıta benzer şekilde, kelime sınırlarına saygı duyan bir arama belirtmenin daha kolay bir yolu -wseçeneği kullanmaktır :

grep -wnr "yourString" .

Cmd komut isteminde veya windows terminalinde grep terimi tanınmıyor
kouty

@kouty grep bir Unix komutudur. itechtics.com/using-findstr-windows
Hugo M. Zuleta

1

Dizin içinde aşağıdaki komutu çalıştırın (terminal). Alt dizinleri de tekrar tekrar kontrol edecektir.

grep -r 'your string goes here' * 

0

Aşağıdaki örnek yinelemeli için görünüyor your search stringiçinde *.xmlve *.jsklasörlerin içindeki dosyaların bulunduğu yerde path1, path2ve path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Böylece, dosyaların alt kümesinde birçok dizin için arama yapabilirsiniz, sadece sonunda yollar sağlar.


-4

Grep kullanmayın. Silver Searcher'ı indirin veya kopyalayın . İkisi de olağanüstü ve tonlarca seçenekle grep veya ack'ten çok daha hızlı.


2
Bunlar belki harika araçlar ama bu OP'nin istediklerini gerçekleştirmek için bu araçları nasıl kullanacağımı cevaplamıyor.
jmathew
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.