it-swarm-tr.com

Özyinelemeli nasıl grep yapabilirim?

Tüm dizinleri ve alt dizinleri özyinelemeli grepname__?

find . | xargs grep "texthere" *
1532
wpiri
grep -r "texthere" .

İlk parametre aranacak normal ifadeyi gösterirken, ikincisi aranması gereken dizini temsil eder. Bu durumda, . geçerli dizin anlamına gelir.

Not: Bu GNU grep için çalışır ve Solaris gibi bazı platformlarda, eski uygulamaların aksine özellikle GNU grep kullanmanız gerekir. Solaris için bu ggrep komutudur.

2304
Vinko Vrsalovic

İstediğiniz dosyanın uzantısını veya desenini biliyorsanız, başka bir yöntem --include seçeneğini kullanmaktır:

grep -r --include "*.txt" texthere .

--exclude ile dışlanacak dosyalardan da bahsedebilirsiniz.

Ag

Sık sık kod üzerinden arama yaparsanız, Ag (The Silver Searcher) , grep komutuna göre daha hızlı bir alternatiftir. Örneğin, varsayılan olarak özyinelemelidir ve .gitignore içinde listelenen dosyaları ve dizinleri otomatik olarak yok sayar, bu nedenle greping veya find için aynı hantal dışlama seçeneklerini geçmeye devam etmek zorunda kalmazsınız.

623
christangrant

Ayrıca:

find ./ -type f -print0 | xargs -0 grep "foo"

ancak grep -r daha iyi bir cevaptır.

120
Kurt

Şimdi her zaman kullanıyorum (Windows'ta bile GoW - Windows'ta Gnu ):

grep --include="*.xxx" -nRHI "my Text to grep" *

Bu, aşağıdaki seçenekleri içerir:

--include=PATTERN

Dizinlerde sadece yinelenen PATTERN dosya eşliğinde arama yapın.

-n, --line-number

Her çıktı satırını giriş dosyasındaki satır numarasıyla önekleyin.

(Not: phuclv adds yorumlarda that -n, performansı çok düşürür , bu nedenle bu seçeneği atlamak isteyebilirsiniz)

-R, -r, --recursive

Her dizinin altındaki tüm dosyaları tekrar tekrar okuyun; bu, -d recurse seçeneğine eşdeğerdir.

-H, --with-filename

Her eşleşme için dosya adını yazdırın.

-I     

İkili dosyayı, eşleşen veri içermiyormuş gibi işleyin;
bu, --binary-files=without-match seçeneğine eşittir.

Büyük küçük harf duyarlı sonuçlar almak istersem, 'i' (-nRHIi) ekleyebilirim.

Alabilirim:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...
107
VonC

POSIX sistemlerinde, grep için -r parametresini bulamıyorsunuz ve grep -rn "stuff" .'nuz çalışmaz, ancak find komutunu kullanırsanız:

find . -type f -exec grep -n "stuff" {} \; -print

Solaris ve HP-UX tarafından kabul edildi.

21
rook

globbing **

grep -r işlevini kullanmak işe yarar, ancak özellikle büyük klasörlerde aşırı yüklenebilir.

Daha pratik kullanım için, i globbing sözdizimi (**) kullanan sözdizimi:

grep "texthere" **/*.txt

bu, yalnızca seçili deseni seçili belirli dosyaları siler. Bash +4 veya zsh gibi desteklenen mermiler için çalışır.

Bu özelliği etkinleştirmek için şu komutu çalıştırın: shopt -s globstar.

Ayrıca bakınız: Linux'ta belirli bir metni içeren tüm dosyaları nasıl bulurum?

git grep

Git sürüm kontrolü altındaki projeler için şunları kullanın:

git grep "pattern"

bu çok daha hızlı.

ripgrep

Daha büyük projeler için, en hızlı grepping aracı, dosyaları varsayılan olarak yinelemeli olarak yakalayan ripgrep :

rg "pattern" .

Sonlu otomata, SIMD ve agresif hazır optimizasyonları kullanarak çok hızlı arama yapan Rust'in regex motoru üzerine inşa edilmiştir. Burada ayrıntılı analiz kontrol edin.

16
kenorb

files ismini bulmak için path özniteliğini içerecek şekilde string özelliğine sahip olan UNIX için aşağıdaki komutu kullanın:

find . | xargs grep "searched-string"

Linux için:

grep -r "searched-string" .

UNIX sunucusunda bir dosya bul

find . -type f -name file_name

lINUX sunucusunda bir dosya bulmak

find . -name file_name
11

sadece dosya isimleri de faydalı olabilir

grep -r -l "foo" .
10
chim

Sadece gerçek dizinleri takip etmek ve sembolik linkleri takip etmek istemiyorsanız,

grep -r "thingToBeFound" directory

Sembolik bağları ve asıl dizinleri takip etmek istiyorsanız (sonsuz özyinelemeye dikkat edin),

grep -R "thing to be found" directory

Özyinelemeli bir şekilde grep yapmaya çalıştığınızdan, aşağıdaki seçenekler sizin için de yararlı olabilir:

-H: outputs the filename with the line

-n: outputs the line number in the file

Bu nedenle, geçerli dizinde Darth Vader içeren tüm dosyaları veya alt dizinleri bulmak ve dosya adını ve satır numarasını yakalamak, ancak özyinelemenin sembolik bağları izlemesini istemiyorsanız, komut

grep -rnH "Darth Vader" .

Eğer dizindeki Word kedisinin tüm sözlerini bulmak isterseniz

/home/adam/Desktop/TomAndJerry 

ve şu anda dizinde

/home/adam/Desktop/WorldDominationPlot

ve dosya adını yakalamak istiyorsunuz, ancak "cats" dizesinin herhangi bir örneğinin satır numarasını değil, bulursanız özyinelemenin sembolik bağları izlemesini istiyorsanız aşağıdakilerden birini çalıştırabilirsiniz:

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

Kaynak:

"grep --help" çalışıyor

Sembolik bağlantılara kısa bir giriş, bu cevabı okuyan ve bunlara atıfta bulunduğum kişi için kafam karıştı: https://www.nixtutor.com/freebsd/understanding-symbolic-links/

9
SarcasticSully

ag bunu şimdi yapmak için en sevdiğim yoldur github.com/ggreer/the_silver_searcher . Temelde ack ile aynı şey ancak birkaç daha fazla optimizasyon ile.

İşte kısa bir kriter. Her testten önce ön belleği temizlerim (cf https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

[email protected]$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s
8
dranxo

Şu anki makinemde durumum için çalışan (Windows 7'deki git bash):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

Her zaman -Print0 ve -0 boşluklu yollar için unutuyorum.

EDIT: Tercih edilen aracım şimdi ripgrep: https://github.com/BurntSushi/ripgrep/releases . Gerçekten hızlı ve daha iyi varsayılanlara sahip (varsayılan olarak özyinelemeli gibi). Orijinal cevabım ile aynı örnek ancak ripgrep kullanarak: rg -g "*.cs" "content pattern"

6
arkod

Bir dizin yapısından tüm dosyalarda belirli bir içerik arıyorsanız, ne yaptığınız daha açık olduğundan find öğesini kullanabilirsiniz:

find -type f -exec grep -l "texthere" {} +

-l (L'nin küçük harfleri) metni içeren dosyanın adını gösterir. Eşleşmenin kendisini yazdırmak istiyorsanız, kaldırın. Veya dosyayı eşleştirmeyle birlikte almak için -H öğesini kullanın. Hep birlikte, diğer alternatifler:

find -type f -exec grep -Hn "texthere" {} +

-n satır numarasını yazdırır.

6
fedorqui

Bu çalışmalı:

grep -R "texthere" *
5
sumit kumar

grep -r "texthere" .(sonunda uyarı süresi)

(^ kredi: https://stackoverflow.com/a/1987928/1438029 )


Açıklama:

grep -r "texthere" / (özyinelemeli grep tümü dizinler ve alt dizinler)

grep -r "texthere" . (özyinelemeli grep bunlar dizinler ve alt dizinler)

grep özyinelemeli

grep [options] PATTERN [FILE...]

[Seçenekler]

-R, -r, --recursive

Her dizinin altındaki tüm dosyaları tekrar tekrar okuyun.

Bu, -d recurse veya --directories=recurse seçeneğine eşdeğerdir.

http://linuxcommand.org/man_pages/grep1.html

grep yardım

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

Alternatifler

ack ( http://beyondgrep.com/ )

ag ( http://github.com/ggreer/the_silver_searcher )

4
Geoffrey Hale

IBM AIX Sunucumda (OS sürümü: AIX 5.2), şunları kullanın:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

bu, dosyadaki yolu/dosya adını ve bağıl satır numarasını yazdıracaktır:

./inc/xxxx_x.h

2865:/** Açıklama: stringYouWannaFind * /

neyse, benim için çalışıyor:)

3
user3606336

Aşağıda, String ve Unix ortamlarında tekrarlı olarak Linux araması yapma komutu verilmiştir.

UNIX komutu için:

find . -name "string to be searched" -exec grep "text" "{}" \;

Linux komutu için:

grep -r "string to be searched" .

Sanırım yazmaya çalıştığın şey bu.

grep myText $(find .)

grep hit dosyalarını bulmak istiyorsanız ve bu başka bir yararlı olabilir.

grep myText $(find .) | cut -d : -f 1 | sort | uniq
2
Victor Faria

2018'de ripgrep veya the-silver-searcher kullanmak istiyorsunuz, çünkü alternatiflerden çok daha hızlılar.

İşte 336 birinci seviye alt dizini olan bir dizin:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

OSX'te bu ripgrep: brew install ripgrep öğesini yükler. Bu silver-searcher: brew install the_silver_searcher 'u yükler.

2
hughdbrown

Mevcut bayrakların bir listesi için:

grep --help 

Geçerli dizindeki regexp texthere için tüm eşleşmeleri ve karşılık gelen satır sayısını döndürür:

grep -rn "texthere" .

Kök dizinden başlayarak texthere için tüm eşleşmeleri karşılık gelen satır numarası ve yok sayma durumu ile döndürür:

grep -rni "texthere" /

burada kullanılan bayraklar:

  • -r özyinelemeli
  • -n çıktı ile yazdırma satır numarası
  • -i davayı yoksay
2
JSON C11

Bulunacak çok fazla dosya olduğunda find . -type f | xargs grep whatever çözüm türlerinin "Uzun süre argüman listesi" hatalarıyla karşılaşacağını unutmayın.

En iyi bahis grep -r dır, ancak bu mümkün değilse, bunun yerine find . -type f -exec grep -H whatever {} \; kullanın.

1
m.thome

Sadece eğlence için, @christangrant yanıtı :-) yazmak için çok fazlaysa * .txt dosyalarının hızlı ve kirli bir araması :-)

grep -r texthere .|grep .txt

1
PJ Brunet

Burada, belirli bir klasörün ($ 1) tüm alt klasörlerini gezen ve verilen dosyalarda ($ 2) verilen dize için grep search'leri kullanan ($ 2) yinelemeli (bash ve sh ile hafifçe test edilmiştir) işlevi verilmiştir:

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

Çalıştırma ve örnek çıktı:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
0
James Brown