Alt dizinler de dahil olmak üzere metni bulmak için "grep" komutu nasıl kullanılır

Belirli bir metin dizesi içeren tüm dosyaları bulmak istiyorum. Bu grep komut çalışır, ancak bunu her dizin için nasıl kullanacağımı bilmiyorum (yalnızca geçerli dizinim için yapabilirim). Okumaya çalıştım man grep ama hiçbir yardımı olmadı.

Kullanmak daha iyi olurdu

grep -rl "string" /path

nerede

  • -r (veya --recursive) seçeneği, tüm alt dizinleri de geçmek için kullanılır. /path, ise
  • -l (veya --files-with-matches) seçeneği, eşleşen satırların değil, yalnızca eşleşen dosyaların dosya adlarını yazdırmak için kullanılır (bu, verilen hızı da artırabilir grep bu seçenekle ilk eşleşmede bir dosyayı okumayı durdurun).

Dosyalarda eşleşen satırları arıyorsanız, en sevdiğim komut şudur::

grep -Hrn 'search term' path/to/files
  • -H dosya adının yazdırılmasına neden olur (birden çok dosya arandığında ima edilir)
  • -r özyinelemeli arama yapar mı
  • -n satır numarasının yazdırılmasına neden olur

path/to/files olabilir . geçerli dizinde arama yapmak için

Çok yararlı bulduğum diğer seçenekler:

  • -I ikili dosyaları yoksay (tamamlayıcı: -a tüm dosyaları metin olarak ele al)
  • -F tedavi etmek search term normal bir ifade değil, gerçek bir ifade olarak
  • -i büyük / küçük harf duyarlı olmayan bir arama yapın
  • --color=always borulama yaparken bile renkleri zorlamak için less. Yapmak less destek renkleri, kullanmanız gerekir -r seçenek:

    grep -Hrn search . | less -r
  • --exclude-dir=dir gibi dizinleri hariç tutmak için kullanışlıdır .svn ve .git.

Example output

Böyle bir şeyi kullanabileceğine inanıyorum.:

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 dizinleri değil, yalnızca dosyaları işlemesi gerektiğini belirtir.
  • -exec grep bulunan her dosya için, dosya adını bağımsız değişken olarak geçirerek grep komutunu çalıştırması gerektiğini belirtir. {} dosya adı ile

Varsayılan komutum

grep -Rin string *

Capitol 'R' kullanıyorum çünkü ls özyinelemeli için kullanır. Grep her ikisini de kabul ettiğinden, onu kullanmamak için bir sebep yok.

DÜZENLEME: HVNSweeting başına, görünüşe göre -R symlinks'i nerede takip edecek -r olmaz.

Yeni bir şey denemeye istekliysen, ver ack çekim. Geçerli dizini yinelemeli olarak arama komutu string oluyor:

ack string

Kurulum oldukça basittir:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(Dizine zaten sahip olmanız şartıyla ~/bin ve tercihen senin PATH.)

Rgrep komutu böyle bir ihtiyaç için ayrılmıştır

Mevcut değilse, bu şekilde alabilirsiniz

mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep

Yukarıda açıklandığı gibi doğrudan varsayılan grep seçeneklerinize ayarlayabilirsiniz.

Kişisel olarak kullanıyorum

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"

ilgili konu : rgrep'i her zaman renkle nasıl kullanabilirim

Güncelleme 2:

Bu komut satırı kullanarak find ve grep sorunu giderir:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> renkli çıktı için:

$ find path_to_search_in -type f \            -exec grep --color=always -in searchString {} 2>/dev/null +

Örnek:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

Aşağıdaki anlık görüntüde çalışan bir örnek:


Güncelleme 1:

Aşağıdaki kodu deneyebilirsiniz; bir işlev olarak .bashrc veya .bash_aliases veya bir senaryoda:

wherein () {     for i in $(find "$1" -type f 2> /dev/null);    do        if grep --color=auto -i "$2" "$i" 2> /dev/null; then            echo -e "\033[0;32mFound in: $i \033[0m\n";        fi;    done}

Kullanma: wherein /path/to/search/in/ searchkeyword

örnek:

$ wherein ~/Documents/ "hello world"

(Not: @enzotib tarafından aşağıdaki yorumlarda önerildiği gibi, bu, adlarındaki boşluklar da dahil olmak üzere dosya / dizinlerle çalışmaz.)


Orijinal gönderi

Dizeyi aramak ve arama dizesiyle yalnızca bu 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;

grep (GNU veya BSD)

Kullanabilirsiniz grep geçerli klasörü yinelemeli olarak aramak için kullanılan araç -r parametre gibi:

grep -r "pattern" .

Not: -r - Yinelemeli olarak alt dizinleri arayın.

Belirli dosyalar içinde arama yapmak için aşağıdakileri kullanabilirsiniz: globbing sözdizimi gibi:

grep "class foo" **/*.c

Not: kullanarak globbing seçeneği (**), tüm dosyaları belirli bir uzantı veya desenle yinelemeli olarak tarar. Bu sözdizimini etkinleştirmek için şunu çalıştırın: shopt -s globstar. Ayrıca şunları da kullanabilirsiniz **/*.* tüm dosyalar (gizli ve uzantı olmadan hariç) veya başka herhangi bir desen için.

Eğer argüman bir hata varsa, aramanızı daraltarak düşünün, ya da kullanın find bunun yerine sözdizimi gibi:

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, şunları kullanmalısınız ripgrep bunun yerine, gibi:

rg "pattern" .

Bu dokümanlar, yükleme adımları ya da kaynak kod teslim GitHub proje sayfası.

Bu, diğer araçlardan çok daha hızlıdır GNU/BSD grep, ucg, ag, sift, ack, pt ya da benzer, üstüne inşa edildiği için Rust'un regex motoru aramayı çok hızlı hale getirmek için sonlu otomata, SIMD ve agresif değişmez optimizasyonlar kullanır.

Belirtilen kalıpları yoksaymayı destekler .gitignore dosyalar, 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ı görmezden gel.
  • -w - Tüm kelimeleri arayın (kısmi kelime eşleşmesinin tersi).
  • -n - Maçın çizgisini göster.
  • -C/--context (mesela. -C5) - Bağlamı artırır, böylece çevreleyen 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ırların sayısını görüntüler. Birlikte olabilir -H.

Bunu çok az takdir edilen bir komut olan xargs kullanarak yapıyorum

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

bulmak./ geçerli bir klasördeki tüm dosyaların özyinelemeli bir listesini verir, ardından bu dosyaların her birinde grep komutunu yürüten xargs'a aktarırsınız

Burada çok fazla cevap olduğunu biliyorum, ancak dosyaları ararken başka kısıtlamalar eklemek isterseniz bir alternatif var:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

Bu işe yarıyor çünkü grep bir sonuç bulursa 0, aksi halde 1 döndürür. Örneğin, 1 MB büyük dosyaları bulabilirsiniz ve bir şey içeren:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Birden çok gereksinim için muhtemelen iyileştirici bayrağını kullanmak istersiniz -O bu GNU grep'te var.

`–include ="* ile joker karakter.C "’ seçeneği, @user311346, @Lekensteyn’e teşekkürler.

grep -Rİn * Geçerli dizinlerden tüm metin dosyalarında arama yapar.
Aramamı * gibi dosya kalıplarında yinelemeli olarak nasıl yapacağımdan emin değilim.Sadece grep ile C

Geçerli ve tüm alt dizinlerdeki bir dize için dosyaları yinelemeli olarak aramak için bul ve grep birleşimini kullanın. Şuna bak http://wilddiary.com/find-files-containing-my-text/