Làm thế nào thực hiện thao tác grep trên tất cả các tệp trong một thư mục


218

Làm việc với xenserver và tôi muốn thực hiện một lệnh trên mỗi tệp trong một thư mục, lấy một số nội dung ra khỏi đầu ra của lệnh và nối nó vào một tệp.

Tôi rõ ràng về lệnh tôi muốn sử dụng và cách grep chuỗi (s) khi cần.

Nhưng điều tôi không rõ là làm thế nào để tôi thực hiện lệnh này trên mỗi tệp, đi tiếp theo, cho đến khi không tìm thấy thêm tệp nào.

Câu trả lời:


228

grep $PATTERN *sẽ là đủ Theo mặc định, grep sẽ bỏ qua tất cả các thư mục con. Tuy nhiên, nếu bạn muốn grep qua chúng, grep -r $PATTERN *là trường hợp.


37
"grep -r $ THỰC HIỆN." là đủ. Đối với grep đệ quy, bạn không cần chỉ định tất cả các tệp
Cougar

1
Làm cách nào để bao gồm nhiều tiện ích mở rộng? Ví dụ. "* .Cpp", "* .h"?
Tomáš Zato - Phục hồi Monica

1
@ Tomáš Zato, chỉ cần cung cấp tất cả các mẫu tệp của bạn thay vì * : grep $PATTERN *.cpp *.h. Nếu bạn cần các quy tắc cụ thể hơn cho những tập tin nào sẽ được findkiểm tra, hãy sử dụng lệnh (kiểm tra câu trả lời của Rob).
umi

@umi Nếu tôi chạy grep -r x .kết quả đến từ tất cả các tệp của tất cả các tiện ích mở rộng. Nếu tôi chạy grep -r x *.scsshơn tôi không nhận được kết quả.
Chris

1
@Chris có thể bạn không có *.scsstệp trong thư mục hiện tại nhưng ở đâu đó sâu hơn trong thư mục con nên grep không tìm trong tất cả các tệp bạn muốn. Bạn nên sử dụng --includetùy chọn để yêu cầu grep xem xét đệ quy các tệp khớp với các mẫu cụ thể: grep -r x --include '*.scss' . (lưu ý các trích dẫn, chúng ngăn không cho mẫu được mở rộng bởi trình bao). Hoặc chỉ sử dụng find(xem câu trả lời của Rob).
umi

168

Trong Linux, tôi thường sử dụng lệnh này để grep đệ quy cho một văn bản cụ thể trong một thư mục

grep -rni "string" *

Ở đâu,

r = đệ quy tức là tìm kiếm các thư mục con trong thư mục hiện tại
n = để in các số dòng thành stdout
i = tìm kiếm không phân biệt chữ hoa chữ thường


32

Sử dụng tìm. Nghiêm túc mà nói, đó là cách tốt nhất bởi vì sau đó bạn thực sự có thể thấy những tập tin nào nó đang hoạt động:

find . -name "*.sql" -exec grep -H "slow" {} \;

Lưu ý, -H là dành riêng cho mac, nó hiển thị tên tệp trong kết quả.


7
Nếu bạn quyết định sử dụng find, dẫn đầu ra thông qua xargsthay vì sử dụng -execđiều này sẽ nhanh hơn nhiều , bởi vì -execsinh ra một quy trình mới cho mỗi grep và chi phí trở nên quan trọng với số lượng lớn tệp. Cảnh báo tiêu chuẩn về không gian trong tên tệp áp dụng cho xargs.
Barton Chittenden

2
Điều này sẽ trông như thế nào chính xác? Tôi luôn quên xargscú pháp.
Brian Peterson

3
@BrianPeterson nó sẽ giống như thế:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

Để tìm kiếm trong tất cả các thư mục con, nhưng chỉ trong các loại tệp cụ thể , hãy sử dụng grep với --include.

Ví dụ: tìm kiếm đệ quy trong thư mục hiện tại, cho văn bản trong * .yml và * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}

1

Nếu bạn muốn thực hiện nhiều lệnh, bạn có thể sử dụng:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
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.