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ırabilirgrep
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 etmeksearch 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çinless
. Yapmakless
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
.
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/