Làm thế nào để sử dụng "chỉnh sửa" lệnh để tìm văn bản bao gồm cả con

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" /path

nơ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 /path trong 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ằng grep dừ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
  • -H gây ra tên để được in (ngụ ý khi nhiều tập tin đang tìm kiếm)
  • -r không một đệ quy tìm kiếm
  • -n nguyê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:

  • -I bỏ 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 term như một chữ không phải là một biểu hiện thường xuyên
  • -i là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 qua less. Để làm cho less hỗ trợ màu sắc, bạn phải sử dụng những -r lựa chọn:

    grep -Hrn search . | less -r
  • --exclude-dir=dir hữu ích cho trừ các thư mục như thế .svn.git.

Example output

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 f ghi 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 grep ghi 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 string

Cà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 rgrep

Bạ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 findgrep 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"; done

ví dụ::

$ for i in $(find /usr/share/applications -type f); \    do grep -i "web browser" "$i"; done

Hiể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" **/*.c

Chú ý: 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 {} ';' -print

Nà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 có một cái gì đó:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Cho 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/