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|.jscó 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|.jscó 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 rlá cờ nghĩa để tìm kiếm đệ quy (thư mục con tìm kiếm). Các ilá 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 directorytrê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 -rphương tiện làm việc này một cách đệ quy, phải xuống cây thư mục
số -nin dòng cho phù hợp.
các --includephé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/
-ltùy chọn (chỉ in tên tệp trùng khớp) thay vì-n
findchúng và grepcho 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)" /dirtrên thư mục weigth ~ 500Gb.
Âm thanh như một công việc hoàn hảo cho grephoặ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 xargsphươ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-extendedcho findbiết loại regex nào để mong đợi-regex "^.*\.(php|html|js)$"nói findtên regex chính nó phải khớp-exec grep -EH '(document\.cookie|setcookie)' {} \;yêu findcầu chạy lệnh (với các tùy chọn và đối số của nó) được chỉ định giữa -exectù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
Etùy chọn cho biết grepsử dụng regex mở rộng (để hỗ trợ dấu ngoặc đơn) và ...Htùy chọn yêu grepcầ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 findlệnh tiếp theo sau lệnh này (nghĩa là sed, sau đó sort)rtùy chọn cho biết sedsử 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ế.unói sắp xếp để loại bỏ các mục trùng lặp (lấy sort -ulà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).