Trong bash, tôi muốn trả về tên tệp (và đường dẫn đến tệp) cho mọi tệp .php|.html|.js
có chứa chuỗi không phân biệt chữ hoa chữ thường"document.cookie" | "setcookie"
Làm thế nào tôi có thể làm điều đó?
Trong bash, tôi muốn trả về tên tệp (và đường dẫn đến tệp) cho mọi tệp .php|.html|.js
có chứa chuỗi không phân biệt chữ hoa chữ thường"document.cookie" | "setcookie"
Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
Các r
lá cờ nghĩa để tìm kiếm đệ quy (thư mục con tìm kiếm). Các i
lá cờ nghĩa phân biệt dạng chữ.
Nếu bạn chỉ muốn tên tệp thêm cờ l
(chữ thường L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
trên Ubuntu Desktop 16; Có gợi ý nào không?
--include=\*.{php,html,js}
Hãy thử một cái gì đó như grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
các -i
làm cho nó trường hợp insensitlve
các .
tại các phương tiện cuối cùng bạn muốn bắt đầu từ thư mục hiện tại của bạn, điều này có thể được thay thế bằng bất kỳ thư mục.
các -r
phương tiện làm việc này một cách đệ quy, phải xuống cây thư mục
số -n
in dòng cho phù hợp.
các --include
phép bạn thêm tên file, phần mở rộng. Ký tự đại diện được chấp nhận
Để biết thêm thông tin, hãy xem: http://www.gnu.org/software/grep/
-l
tùy chọn (chỉ in tên tệp trùng khớp) thay vì-n
find
chúng và grep
cho chuỗi:
Điều này sẽ tìm thấy tất cả các tệp của 3 loại của bạn trong / started / path và grep cho biểu thức thông thường '(document\.cookie|setcookie)'
. Tách hơn 2 dòng với dấu gạch chéo ngược chỉ để dễ đọc ...
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
trên thư mục weigth ~ 500Gb.
Âm thanh như một công việc hoàn hảo cho grep
hoặc có lẽ ack
Hoặc công trình tuyệt vời này:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
-exec grep...
tốt hơn xargs
phương pháp của tôi vì nó sẽ không bị sặc trên không gian trong tên tệp.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Tất nhiên, các tùy chọn khác cũng có thể được thêm vào.
Chỉ cần thêm một lựa chọn khác, bạn cũng có thể sử dụng điều này:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Ở đâu:
-regextype posix-extended
cho find
biết loại regex nào để mong đợi-regex "^.*\.(php|html|js)$"
nói find
tên regex chính nó phải khớp-exec grep -EH '(document\.cookie|setcookie)' {} \;
yêu find
cầu chạy lệnh (với các tùy chọn và đối số của nó) được chỉ định giữa -exec
tùy chọn và \;
cho mỗi tệp mà nó tìm thấy, trong đó {}
biểu thị nơi đường dẫn tệp đi trong lệnh này.
trong khi
E
tùy chọn cho biết grep
sử dụng regex mở rộng (để hỗ trợ dấu ngoặc đơn) và ...H
tùy chọn yêu grep
cầu in đường dẫn tập tin trước khi khớp.Và, với điều này, nếu bạn chỉ muốn đường dẫn tệp, bạn có thể sử dụng:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Ở đâu
|
[pipe] gửi đầu ra của find
lệnh tiếp theo sau lệnh này (nghĩa là sed
, sau đó sort
)r
tùy chọn cho biết sed
sử dụng regex mở rộng.s/HI/BYE/
nói sed
để thay thế mọi lần xuất hiện đầu tiên (trên mỗi dòng) của "HI" bằng "BYE" và ...s/(^.*):.*$/\1/
bảo nó thay thế regex (^.*):.*$
(nghĩa là một nhóm [thứ được bao quanh bởi ()
] bao gồm mọi thứ [ .*
= một hoặc nhiều ký tự bất kỳ] từ đầu dòng [ ^
] cho đến 'đầu tiên': 'theo sau là bất cứ thứ gì cho đến cuối ' dòng [ $
]) bởi nhóm đầu tiên [ \1
] của regex được thay thế.u
nói sắp xếp để loại bỏ các mục trùng lặp (lấy sort -u
làm tùy chọn).... FAR từ cách thanh lịch nhất. Như tôi đã nói, ý định của tôi là tăng phạm vi khả năng (và cũng để đưa ra những giải thích đầy đủ hơn về một số công cụ bạn có thể sử dụng).