Belirli bir metni içeren dosyaları bulma


153

Bash'da büyük / .php|.html|.jsküçük harfe duyarlı olmayan dizeyi içeren her dosya için dosya adını (ve dosyanın yolunu) döndürmek istiyorum"document.cookie" | "setcookie"

Bunu nasıl yaparım?


4
Sadece grep kullanmayı düşündün mü? cyberciti.biz/faq/grep-in-bash
Terrance

Bu başlık oldukça yanıltıcı. "verilen-metin-içeren-içeren-dosyaları"
Josh C

Yanıtlar:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

rBayrak (alt dizinleri arama) özyinelemeli arama anlamına gelir. iBayrak vaka duyarsız demektir.

Sadece dosya adlarını istiyorsanız l(küçük harf L) bayrağını ekleyin :

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

Bu benim için işe yaramadı (en azından mac üzerinde değil) .... sadece kilitleniyor ... egrep -lir --include = * "repo" egrep: uyarı: stdin özyinelemeli arama
Dean Hiller

13
Arama yolunu eklemeyi unuttunuz. Yol '.' yukarıdaki örnekte. Sizin durumunuzda, komut dosyası girdinin stdin'de arama yapmasını bekliyor. Deneyin: egrep -lir --include = * "repo" / (veya başka bir yol)
LodeRunner

1
grep -E ... >egrep ...
Aman

grep: (error|fail): No such file or directoryUbuntu Desktop 16'da hata aldım ; ipucu var mı?
Nam G VU

Bunu yapabilmem için * ile \ 'yi atlamak zorunda kaldım. Yani ben var--include=\*.{php,html,js}
Mehrad Mahmoudian

53

Gibi bir şey dene grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-ide olay insensitlve yapar

.Eğer mevcut dizinden başlamak istiyorum uç aracı, bu herhangi bir dizine ile ikame edilebilir.

-raraçlar sağa Dizin ağacı, yinelemeli bunu

-nmaçları için satır numarasını yazdırır.

--includeEğer uzantıları dosya adları eklemenizi sağlar. Joker karakterler kabul edildi

Daha fazla bilgi için bkz. Http://www.gnu.org/software/grep/


4
Ya da belki yerine -lseçeneği kullanın (sadece eşleşen dosya adlarını yazdırın)-n
glenn jackman

15

findonları ve grepdize için:

Bu, 3 türünüzdeki tüm dosyaları başlangıç ​​/ yol ve grep komutlarında normal ifade için bulur '(document\.cookie|setcookie)'. Sadece okunabilirlik için ters eğik çizgi ile 2 çizginin üzerine bölün ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
-exec grep -l 'sth' {} \;
Bulmanın

Teşekkürler @Michael Berkowski Bu şekilde # egrep -ir --include=file.foo "(foo|bar)" /dir~ 500Gb ağırlık dizininde 5 veya 8 kereden daha hızlı .
Qh0stM4N

9

Kulağa mükemmel grepya da belki de ack için mükemmel bir iş gibi geliyor

Veya bu harika yapı:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

Dosya adlarındaki boşlukları boğmayacağı için kullanmak yöntemimden -exec grep...daha iyidir xargs.
Michael Berkowski

@MichaelBerkowski: Sen Dosya adlarında boşluk başa bu gibi kullanabilirsiniz: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Tabii ki, diğer seçenekler de eklenebilir.
Pascal

4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

3

Sadece bir alternatif daha eklemek için şunu da kullanabilirsiniz:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Nerede:

  • -regextype posix-extendedfindne tür regex bekleyeceğini söyler
  • -regex "^.*\.(php|html|js)$"findnormal ifadenin kendisine dosya adlarının eşleşmesi gerektiğini söyler
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;seçenek ile bulduğu her dosya için findbelirtilen komutu (seçenekleri ve bağımsız değişkenleriyle) çalıştırmasını söyler ; burada dosya yolu bu komutun nereye gittiğini gösterir.-exec\;{}

    süre

    • Eseçeneği grep(parantezleri desteklemek için) genişletilmiş normal ifadeyi kullanmayı söyler ve ...
    • Hseçeneği, grepdosya yollarını eşleşmeden önce yazdırmayı söyler .

Ve bu göz önüne alındığında, yalnızca dosya yollarını istiyorsanız, şunları kullanabilirsiniz:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Nerede

  • |[pipe] çıktısını findbundan sonra bir sonraki komuta gönderir (yani sed, o zaman sort)
  • rseçeneği sedgenişletilmiş normal ifadeyi kullanmayı söyler .
  • s/HI/BYE/söyler sed"BYE" ve "HI" nin (her satıra) her şeyden önce tekrarlamasını değiştirmek için ...
  • s/(^.*):.*$/\1/regex yerine söyler (^.*):.*$bir anlam ( grup [çevrelediği şeyler ()dahil] her şeyi [ .*daha herhangi-karakterin = bir veya] satırın başına [ ^] dek 'ilk ':' ifadesini şey kadar' sonunda satır [ $]) değiştirilen normal ifadenin ilk grubu [ \1] tarafından .
  • usıralamaya yinelenen girişleri kaldırmasını söyler ( sort -uisteğe bağlı olarak al).

... en zarif yoldan FAR. Dediğim gibi, amacım olasılıkları artırmak (ve ayrıca kullanabileceğiniz bazı araçlar hakkında daha eksiksiz açıklamalar yapmak).

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.