Tôi muốn tìm thấy tất cả các tập tin đó có chứa một chuỗi cụ thể của văn bản. Những grep lệnh hoạt động, nhưng tôi không biết làm thế nào để sử dụng nó cho mỗi mục (tôi chỉ có thể làm nó cho tôi mục hiện tại). Tôi đã cố gắng đọc man grep nhưng nó đã không mang lại bất kỳ sự giúp đỡ.
Nó sẽ tốt hơn để sử dụng
grep -rl "string" /pathnơi
-
-r(or--recursive) lựa chọn được sử dụng để đi qua cũng tất cả các tiểu thư của/pathtrong khi đó , -
-l(or--files-with-matches) lựa chọn được sử dụng để chỉ in tên của phù hợp với các tập tin, và không phù hợp với dòng (này cũng có thể nâng tốc độ, cho rằnggrepdừng đọc một tập tin lúc đầu trận đấu này lựa chọn).
Nếu bạn đang tìm kiếm đường phù hợp với trong các tập tin yêu thích của tôi là lệnh:
grep -Hrn 'search term' path/to/files-Hgây ra tên để được in (ngụ ý khi nhiều tập tin đang tìm kiếm)-rkhông một đệ quy tìm kiếm-nnguyên nhân số dòng để được in
path/to/files có thể được . để tìm kiếm, trong các mục hiện tại
Một lựa chọn mà tôi tìm thấy rất hữu ích:
-Ibỏ qua các tập tin nhị phân (bổ sung:-ađiều trị tất cả các tập tin là văn bản)-Fđiều trịsearch termnhư một chữ không phải là một biểu hiện thường xuyên-ilàm một trường hợp nhạy cảm tìm kiếm--color=alwaysđể lực lượng màu sắc ngay cả khi đường ống thông qualess. Để làm cholesshỗ trợ màu sắc, bạn phải sử dụng những-rlựa chọn:grep -Hrn search . | less -r--exclude-dir=dirhữu ích cho trừ các thư mục như thế.svnvà.git.
Tôi tin rằng bạn có thể sử dụng một cái gì đó như thế này:
find /path -type f -exec grep -l "string" {} \;Giải thích ý kiến
find là một lệnh cho phép bạn thấy các tập tin khác thư mục, và liên kết trong thư mục con của một con đường. Nếu bạn không chỉ định một mặt nạ đó filesnames nên gặp nó liệt kê tất cả các mục đối tượng.
-
-type fghi rõ rằng nó nên quá trình chỉ có các tập tin, không phải thư mục etc. -
-exec grepghi rõ rằng với mọi tìm thấy nó nên chạy bash lệnh, đi của nó tên là một cuộc tranh cãi với nó, bằng cách thay thế{}với các tập tin
Mặc định của tôi là lệnh
grep -Rin string *Tôi sử dụng một capitol 'R' bởi vì ls sử dụng nó cho đệ. Kể từ khi bash chấp nhận cả, không có lý do gì để không sử dụng nó.
EDIT: mỗi HVNSweeting, rõ ràng -R sẽ theo nơi như liên kết tượng trưng -r sẽ không.
Nếu bạn sẵn sàng để thử một cái gì mới cho ack một bắn. Lệnh để đệ quy tìm kiếm các mục hiện cho string là:
ack stringCài đặt khá đơn giản:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3(Cung cấp cho bạn đã có mục ~/bin và nó tốt hơn là của bạn PATH.)
Lệnh rgrep là dành riêng cho cần thiết phải như vậy
Nếu không có, bạn có thể có nó như thế này
mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrepBạn có thể đặt trực tiếp vào trang định gói lựa chọn như trên.
- Cá nhân tôi sử dụng
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"chủ đề liên quan, : làm thế nào để luôn luôn sử dụng rgrep với màu sắc
Cập nhật 2:
Dòng này của lệnh sử dụng find và grep sửa chữa các vấn đề:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +--color=<always or auto> cho màu ra:
$ find path_to_search_in -type f \ -exec grep --color=always -in searchString {} 2>/dev/null +Ví dụ:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +Một ví dụ chạy trong ảnh chụp dưới đây,:
Cập nhật 1:
Bạn có thể thử sau mã, như một chức năng của bạn .bashrc hay .bash_aliases hoặc ở một kịch bản:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done}
Sử dụng: wherein /path/to/search/in/ searchkeyword
ví dụ:
$ wherein ~/Documents/ "hello world"(Lưu ý: Như đề xuất ý kiến bên dưới của @enzotib, điều này không làm việc với sơ/thư mục, bao gồm không gian trong tên của họ.)
Bài bản gốc
Để tìm kiếm chuỗi và ra đó chỉ phù hợp với việc tìm kiếm chuỗi:
$ for i in $(find /path/of/target/directory -type f); do \ grep -i "the string to look for" "$i"; doneví dụ::
$ for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; doneHiển thị tên chứa tìm kiếm chuỗi:
$ for i in $(find /path/of/target/directory -type f); do \ if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;ví dụ::
$ for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done;
grep (GNU hay DOC)
Bạn có thể sử dụng grep công cụ để tìm kiếm đệ quy các thư mục với hiện tại -r tham số như thế:
grep -r "pattern" .Chú ý: -r - Đệ quy tìm kiếm con.
Để tìm kiếm trong các tập tin cụ thể, bạn có thể sử dụng một globbing cú pháp như:
grep "class foo" **/*.cChú ý: Bằng cách sử dụng globbing lựa chọn (**), nó quét tất cả các tập tin đệ quy với cụ thể mở rộng hoặc mô hình. Để cho phép cú pháp này, chạy: shopt -s globstar. Bạn cũng có thể sử dụng **/*.* cho tất cả các tập tin (trừ ẩn và không có mở rộng) hoặc bất kỳ khác, mô hình.
Nếu bạn đã lỗi mà lập luận của bạn là quá lâu, xem xét thu hẹp xuống tìm kiếm của bạn, hoặc sử dụng find cú pháp thay vì như:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'Ngoài ra sử dụng ripgrep.
ripgrep
Nếu bạn đang làm việc trên dự án lớn hơn hoặc các tập tin lớn, bạn phải sử dụng ripgrep thay vào đó, giống như:
rg "pattern" .Kiểm tra các tài liệu, bước cài đặt hay mã nguồn trên Demo trang.
Nó nhanh hơn nhiều so với bất kỳ khác, cụ thích GNU/DOC grep, ucg, ag, sift, ack, pt hoặc tương tự, kể từ khi nó được xây dựng trên đầu Rust của dom động cơ đó hữu hạn sử dụng máy tự động, SIMD và tích cực theo nghĩa đen tối ưu để giúp tìm kiếm rất nhanh.
Nó hỗ trợ các mẫu bỏ qua quy định .gitignore các tập tin, vì vậy một tập tin duy nhất con có thể phù hợp với nhiều giọt nước mẫu cùng một lúc.
Bạn có thể sử dụng sự phổ biến thông số như:
-
-i- Không nhạy cảm tìm kiếm. -
-I- Bỏ qua các tập tin nhị phân. -
-w- Tìm kiếm cho toàn bộ từ (ở đối diện của một phần kết hợp từ). -
-n- Các dòng bạn của trận đấu. -
-C/--context(ví dụ:-C5) - Tăng bối cảnh đó, vì vậy bạn thấy xung quanh mã . -
--color=auto- Mark lên phù hợp với văn bản. -
-H- Hiển thị tên nơi các văn bản được tìm thấy. -
-c- Hiển thị đếm của phù hợp với dòng. Có thể được kết hợp với-H.
Tôi làm điều này bằng cách sử dụng xargs, một rất đánh giá thấp lệnh
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'tìm thấy ./ cung cấp cho bạn một đệ quy danh sách của tất cả các tập tin trong một giờ folderthen bạn ống nó để xargs đó thực hiện những gói lệnh trên mỗi một trong những tập tin
Tôi biết có rất nhiều câu trả lời ở đây, nhưng đây là một sự thay thế nếu bạn muốn thêm hạn chế khác khi tìm kiếm các tập tin:
find . -type f -exec grep --quiet string_to_look_for {} ';' -printNày hoạt động bởi vì grep sẽ trở về 0 nếu nó tìm thấy một quả là 1 cách khác. Ví dụ, bạn có thể tìm thấy các tập tin 1 MB lớn và có một cái gì đó:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -printCho nhiều yêu cầu có thể bạn muốn sử dụng những ưu cờ -O đó tồn tại trong GNU bash.
Đại diện với --bao gồm="*.C" lựa chọn, @user311346, cảm ơn @Lekensteyn.
bash -RIn <yor mẫu> * Sẽ tìm kiếm từ hiện tại thư mục xuống trong tất cả các văn bản các tập tin.
Không chắc chắn làm thế nào để làm việc của tôi tìm kiếm đệ quy trong thấy mô hình như *.C với chỉ bash
Sử dụng tìm và bash sự kết hợp để sao các tập tin tìm kiếm một chuỗi trong hiện tại và cả tiểu thư mục. Kiểm tra này http://wilddiary.com/find-files-containing-my-text/

