Bash'da büyük / .php|.html|.js
küçü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?
Bash'da büyük / .php|.html|.js
küçü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?
Yanıtlar:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
r
Bayrak (alt dizinleri arama) özyinelemeli arama anlamına gelir. i
Bayrak 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)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
Ubuntu Desktop 16'da hata aldım ; ipucu var mı?
--include=\*.{php,html,js}
Gibi bir şey dene grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
-i
de olay insensitlve yapar
.
Eğer mevcut dizinden başlamak istiyorum uç aracı, bu herhangi bir dizine ile ikame edilebilir.
-r
araçlar sağa Dizin ağacı, yinelemeli bunu
-n
maçları için satır numarasını yazdırır.
--include
Eğer uzantıları dosya adları eklemenizi sağlar. Joker karakterler kabul edildi
Daha fazla bilgi için bkz. Http://www.gnu.org/software/grep/
-l
seçeneği kullanın (sadece eşleşen dosya adlarını yazdırın)-n
find
onları ve grep
dize 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)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
~ 500Gb ağırlık dizininde 5 veya 8 kereden daha hızlı .
Kulağa mükemmel grep
ya 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 {} \;
-exec grep...
daha iyidir xargs
.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Tabii ki, diğer seçenekler de eklenebilir.
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-extended
find
ne tür regex bekleyeceğini söyler-regex "^.*\.(php|html|js)$"
find
normal 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 find
belirtilen 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
E
seçeneği grep
(parantezleri desteklemek için) genişletilmiş normal ifadeyi kullanmayı söyler ve ...H
seçeneği, grep
dosya 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ı find
bundan sonra bir sonraki komuta gönderir (yani sed
, o zaman sort
)r
seçeneği sed
geniş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 .u
sıralamaya yinelenen girişleri kaldırmasını söyler ( sort -u
isteğ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).