Tìm tệp chứa văn bản đã cho


153

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 đó?


4
Bạn đã xem xét chỉ sử dụng grep? cyberciti.biz/faq/grep-in-bash
Terrance

Tiêu đề này là khá sai lệch. "find-files-chứa-a-give-text"
Josh C

Câu trả lời:


212
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)" .

điều đó dường như không hiệu quả với tôi (ít nhất là không phải trên mac) .... chỉ bị treo ... egrep -lir --include = * "repo" egrep: cảnh báo: tìm kiếm đệ quy của stdin
Dean Hiller

13
Bạn quên thêm đường dẫn để tìm kiếm. Đường dẫn là '.' trong ví dụ trên. Trong trường hợp của bạn, tập lệnh đang chờ đầu vào để tìm kiếm trên stdin. Hãy thử: egrep -lir --include = * "repo" / (hoặc bất kỳ đường dẫn nào khác)
LodeRunner

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

Tôi gặp lỗi grep: (error|fail): No such file or directorytrên Ubuntu Desktop 16; Có gợi ý nào không?
Nam G VU

Để tôi làm việc này, tôi phải bỏ qua * với \. vì vậy tôi có--include=\*.{php,html,js}
Mehrad Mahmoudian

53

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/


4
Hoặc có thể sử dụng -ltùy chọn (chỉ in tên tệp trùng khớp) thay vì-n
glenn jackman

15

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)'

1
Giống như việc sử dụng phổ biến của tìm kiếm, nhưng theo tôi thì tốt hơn là sử dụng-exec grep -l 'sth' {} \;
NGix

Cảm ơn @Michael Berkowski Cách này nhanh nhất hơn 5 hoặc 8 lần # egrep -ir --include=file.foo "(foo|bar)" /dirtrên thư mục weigth ~ 500Gb.
Qh0stM4N

9

Â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 {} \;

+1 Sử dụng -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.
Michael Berkowski

@MichaelBerkowski: Bạn có thể sử dụng nó như thế này để xử lý khoảng trắng 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.
Pascal

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

3

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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.