it-swarm-tr.com

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

Belirli bir metin dizesini 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ına değil, dosya içindeki metni 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, çalışmıyor. Sistemdeki her dosyayı görüntülemek gibi görünüyor.

Bu, bunu yapmanın doğru yoluna yakın mı? 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.

4457
Nathan

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 Word ile 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ı etkili arama için kullanılabilir:

  • Bu sadece .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ı engelleyecektir:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Dizinler için belirli bir dizini (ler) --exclude-dir parametresi ile dışlamak 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 adresini kontrol edin.

8076
rakib_

grep -ilR kullanabilirsiniz:

grep -Ril "text-to-find-here" /
  • i, yoksayma durumunu belirtir (durumunuzda isteğe bağlı).
  • R özyinelemeli anlamına gelir.
  • l, "sonucun kendisini değil, dosya adını göster" anlamına gelir.
  • /, makinenizin kökünde başlangıç ​​anlamına gelir.
1279
fedorqui

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

Sadece yap:

ack 'text-to-find-here'

Kök dizininizde.

Ayrıca normal ifadeleri , dosya tipini belirtme vb.


GÜNCELLEME

Yeni keşfettim The Silver Searcher , ack'e benziyor ama ondan 3-5x daha hızlı ve hatta bir .gitignore dosyasındaki kalıpları yok sayar.

283
EarlOfEgo

Kullanabilirsiniz:

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

r özyinelemeli anlamına gelir ve böylece 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 "Arama için dize"/yol/dizin/dizin/veya/dosya - r: özyinelemeli arama n: maçlar için satır numarası gösterilecek

156
learner_19

Bunu kullanabilirsiniz:

grep -inr "Text" folder/to/be/searched/
98
A R

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

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

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

Örnek

Diyelim ki dizinde "Apache License" adlı belirli bir metni içeren dosyaları ara. 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 durumda kullanmasanız bile, davayı yoksaymak için -i anahtarını kullanabilirsiniz. Daha fazla ayrıntıyı okuyabilirsiniz burada .

Umarım bu size yardımcı olur.

59
lkamal

grep'niz özyinelemeli aramayı desteklemiyorsa, find ile xargs:

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

Bunu hatırlamak, find -exec formatından daha kolay hatırlıyorum.

Bu, dosya adını ve eşleşen satırın içeriğini, örneğin;.

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

grep öğesine eklemek isteyebileceğiniz isteğe bağlı bayraklar:

  • -i - büyük/küçük harf duyarlı arama
  • -l - yalnızca eşleşmenin bulunduğu dosya adını çıkarır
  • -h - yalnızca eşleşen satırı görüntüler (dosya adı değil)
51
RobEarl
grep -insr "pattern" *
  • i: Hem PATTERN hem de giriş dosyalarındaki 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 dosyalar hakkındaki hata mesajlarını bastır.
  • r: Her dizinin altındaki tüm dosyaları tekrar tekrar okuyun.
38
enfinet

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


Örnekte olduğu gibi find kullanıyorsanız, grep öğesine -s (--no-messages) daha iyi ekleyin, ve 2>/dev/null komutunun sonunda çok fazla İzin reddedildigrep ve find tarafından verilen mesajları önlemek için _:

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

find Unix benzeri platformlarda, belirli bir metin ararken grep ile birleştirilmiş dosyaları aramak için kullanılan standart araçtır. find komutu sıklıkla xargs ile birlikte kullanılır.

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

Daha hızlı ve daha kolay alternatifler

RipGrep - Etrafında en hızlı arama aracı:

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

Gümüş Arama:

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 kaçınamıyorsanız, aramayın '/' (kök dizin) uzun ve yetersiz bir arama yapmamak için! Bu nedenle yukarıdaki örneklerde, '/' ifadesini bir alt dizin adıyla değiştirin; "/ home" gerçekte aramak istediğiniz yere bağlı olarak ...

33
Bludzee

Deneyin:

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

Silversearcher adında 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 bir şey elde edemezsiniz.

Sadece kullanabilirsiniz

ag -ia "Search query"

Ve sizin için görevi yapacak!

27
Neil Agarwal

Bulunduğunuz dizinde arama yapmak için pwd komutunu kullanın, aşağı doğru özyineleyin

grep -rnw `pwd` -e "pattern"

Güncelle / Kullanmakta olduğunuz grep sürümüne bağlı olarak, pwd öğesini ihmal edebilirsiniz. Daha yeni sürümlerde ., eğer böyle bir dizin belirtilmezse, grep için varsayılan durum gibi görünüyor:

grep -rnw -e "pattern"

veya

grep -rnw "pattern"

yukarıdaki gibi aynı şeyi yapacağım!

26
mahatmanich

Bir dizge aramasak bile grep kullanılabilir.

Basitçe koşuyor,

grep -RIl "" .

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

18
Alex Jasmin

İş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
Atul Arvind

Basit bir find kullanışlı çalışabilir. ~/.bashrc dosyanızdaki takma ad:

alias ffind find / -type f | xargs grep

Yeni bir terminal başlat ve sorun:

ffind 'text-to-find-here'
14
danglingpointer
find /path -type f -exec grep -l "string" {} \;

Yorumlardan açıklama

find, dosyaları ve belirli bir yolun alt dizinlerinde bulunan dizinler ve bağlantılar gibi diğer nesneleri bulmanızı sağlayan bir komuttur. Dosya adlarının yerine getirmesi 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
Vinod Joshi

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

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

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

Ve dosya türünün ne olduğu hakkında bir fikriniz varsa, aranacak dosya türü uzantılarını belirleyerek aramanızı daraltabilirsiniz, bu durumda .pas OR .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. find içindeki ., geçerli dizinden belirtir.
  2. -name "*.*": tüm dosyalar için (-name "*.pas" -o -name "*.dfm"): Yalnızca *.pasOR *.dfm dosyaları, -o ile belirtilen OR
  3. -type f, dosyaları aradığınızı belirtir
  4. -print0 (pipe) öğesinin diğer tarafındaki --null ve |, çok önemli olanlardır; dosya adını find'den grep dizinine, xargs biçimine gömdüler, dosya adlarının içine yerleştirilen, dosya adlarının boşluklara girmesine izin vererek, grep yolunu açabilirler. ve dosya adı bir dizedir ve her alanda ayrılmaz.
14
Gert van Biljon

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

Linux, Mac ve Windows üzerinde çalışır ve Hacker News / birkaç ay önce yazılmıştır (Andrew Gallant'ın GitHub bağlantısı olan Bloguna bir bağlantı vardır):

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

14
AAAfarmclub

Deneyin:

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

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

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

Bir Python betiği benzer bir şey yazdım. Bu, bu komut dosyasını nasıl kullanması gerektiğidir.

./sniff.py path pattern_to_search [file_pattern]

İlk argüman, path, tekrarlı olarak arayacağımız dizindir. İkinci argüman, pattern_to_search, bir dosyada aramak istediğimiz normal bir ifadedir. Pythonre kütüphanesinde tanımlanan normal ifade formatını kullanıyoruz. Bu kodda, . ayrıca newline ile eşleşir.

Üçüncü argüman, file_pattern, 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, Python dosyalarını py içeren Pool( ve ardından Word Adaptor uzantılı arama yapmak istersem, aşağıdakileri yaparım:

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

Kullanın:

grep -c Your_Pattern *

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

12
Dr_Hope

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

grep -r <text_fo_find> <directory>

bulunacak metnin büyük/küçük harfini umursamıyorsanız, kullan

grep -ir <text_to_find> <directory>
11
Prash

Önceki tüm cevaplar grep önerir ve bulur. Fakat başka bir yol daha var: Use Midnight Commander

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
Peter M.

Dizeyi aramak ve arama dizesiyle yalnızca bu satırın çıktısını almak 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;
11
user3124504

Tam olarak aradığınızı yapabilecek bir ack aracı var.

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

ack -i search_string folder_path/*

Büyük/küçük harfe duyarlı arama için -i öğesini yok sayabilirsiniz

11
Pal

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

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

Bunu dene:

find . | xargs grep 'Word' -sl
10
Tayab Hussain

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'

'-R' kullanarak 'l' olmadan dosya adlarını ve ardından kalıbın bulunduğu metnini görmek için !

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

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

Umarım yardımcı olur!

10
nitinr708

Dosya adını istemediğiniz ancak tüm dosyaları aramak istediğiniz için aşağıdaki komutu kullanabilirsiniz. İşte "METİN" formunu alıyorum Dosya adının yazdırılmadığından emin olan tüm günlük dosyaları

grep -e TEXT *.log | cut -d' ' --complement -s -f1

-e seçeneğiyle grep, PATTERN eşleşmesinde olduğu gibi diğer seçeneğe kıyasla oldukça hızlıdır

10
Mitul Patel

Güçlükten kaçının ve ack-grep'i takın. 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
Kareem

Kesinlikle find kullanmak istiyorsanız:

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

find + grep

1. Dosyaları aramak için find kullanın, 2.Hepsi hepsinde grep komutunu çalıştırın.

Aşağıdaki gibi bir komutla birleştirilebilir:

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

  • grep sadece belirli dosyaları kullanmak istiyorsanız -name Pattern kullanın:

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

Bu size dosyaları bulmak için find gücünü verebilir. Dosya aramanızı geliştirmek veya daraltmak için onunla oynayabilir ve farklı find seçeneklerini kullanabilirsiniz.

8
BreakBadSP

findname__, xargname__s ile birlikte seçilebilecek çok sayıda potansiyel eşleşme olduğunda tercih edilir. Diğer seçeneklerden daha yavaş çalışır, ancak her zaman çalışır. Bazılarının keşfettiği gibi, xargsname__, varsayılan olarak gömülü boşluklu dosyaları işlemez. -d seçeneğini belirleyerek bunun üstesinden gelebilirsiniz.

İşte @ RobEarl'ın cevabı, geliştirilmiş, böylece boşluklu dosyaları yönetebiliyor:

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

İşte @ venkat'ın cevabı, benzer şekilde geliştirilmiş:

find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"

Benzer şekilde geliştirilmiş olan @Gert van Biljon'un cevabı:

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

Benzer şekilde geliştirilmiş @ LetalProgrammer'ın cevabı:

alias ffind find / -type f | xargs -d '\n' grep

Benzer şekilde geliştirilmiş @ Tayab Hüseyin'in cevabı:

find . | xargs -d '\n' grep 'Word' -sl
7
Mike Slinn

Her zaman kontrol edeceğiniz bir dosya kümeniz varsa, yollarını takma adlandırabilirsiniz, örneğin:

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

O zaman listeyi şöyle filtreleyebilirsiniz:

grep -U -l $'\015' $(fd)

Listeyi filtreleyen fd, CR desenini içeren dosyalara fd.

İlgilendiğim dosyaların takma adlarının daha kolay komut dosyaları oluşturmama yardımcı olduğunu ve ardından tüm bu dosyaları nasıl alacağımı her zaman hatırlamaya çalıştığımı biliyorum. Özyinelemeli şeyler de çalışır, ancak er ya da geç, belirli dosya türlerini ayıklamakla baş etmek zorunda kalacaksınız. Bu yüzden sadece ilgilenmek istediğim tüm dosya türlerini buluyorum.

7
dkinzer

Bunu dene:

find / -type f -name "*" -exec grep -il "String_to_search" {} \;

Veya

for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
7
VIPIN KUMAR

Kullanın:

grep -Erni + "text you wanna search"

Bu komut geçerli dizinin tüm dosya ve dizinlerinde tekrarlamalı olarak arama yapar ve sonucu yazdırır.

Not: grep çıktınız renkli değilse, Shell kaynak dosyanızdaki grep = 'grep --color = always' alias komutunu kullanarak değiştirebilirsiniz.

7
baldash

Bir dosyadan belirli bir metni bulmak için aşağıdaki komutları kullanabilirsiniz:

cat file | grep 'abc' | cut -d':' -f2
7
iamjayp

önceki cevapta Peter olarak belirtilen , önceki tüm cevaplar grep ve find'i önerir.

Fakat Gnome Commander kullanarak// perfectGUIkullanarak ve 2001'den bu yana tonlarca seçenek sunan daha sofistike bir yol var ve dosyaları bulmak bunlardan sadece bir tanesi. Aynı zamanda zaman içinde kanıtlanmış ücretsiz bir yardımcı programdır.

7
Geeocode

Bunu dene

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
6

Ayrıca bakınız The Platinum Searcher , The Silver Searcher ile aynı ve Go ile yazılmıştır.

Örnek:

pt -e 'text to search'
5
Gustavo Paulo

GUI Search Alternative - Masaüstü Kullanımı İçin:

- Soru tam olarak komut istemediği için

Searchmonkey : Düzenli ifadeler kullanarak sisteminizi endekslemek zorunda kalmadan gelişmiş dosya arama aracı. Bulmak/grep almak için grafiksel eşdeğer Linux (Gnome/KDE/Java) ve Windows (Java) için kullanılabilir - açık kaynaklı GPL v3

Özellikler:

  • Gelişmiş Normal İfadeler
  • Bağlam içinde gösterilen sonuçlar
  • Metin içeren ara
  • Metin içeren satırı görüntülemek için panel
  • Yeni 2018 güncelleme
  • vb.

İndir - Bağlantılar:

.

Ekran görüntüsü:

 Enter image description here 

5
intika

komutun doğru. Sadece grep için -l eklemeniz gerekir.

find / -type f -exec grep -l 'text-to-find-here' {} \;
0
FariZ