2013-03-08 35 views
110

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

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

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

Trả lời

58

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

grep -rni "string" * 

nơi,

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

132

grep $PATTERN * 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.

+22

"grep -r $ PATTERN." là đủ. Đối với grep đệ quy, bạn không cần phải 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"? –

+1

@ Tomáš Zato, chỉ 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 cần được grepped, sử dụng lệnh 'find' (kiểm tra câu trả lời của Rob). – umi

21

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

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

Lưu ý, -H là mac cụ thể, nó cho thấy tên tệp trong kết quả.

+5

Nếu bạn quyết định dùng find, pipe output thông qua 'xargs' thay vì sử dụng' -exec', nó sẽ * nhiều * nhanh hơn, bởi vì '-exec' sinh ra một tiến trình mới cho mỗi grep, và overhead sẽ trở nên đáng kể với một số lượng tệp lớn. Cảnh báo chuẩn về khoảng trống trong tên tệp áp dụng cho 'xargs'. –

+2

Điều này trông giống như thế nào? Tôi luôn quên cú pháp 'xargs'. –

+1

@BrianPeterson nó sẽ là một cái gì đó như thế: 'tìm. -iname "* .sql" -print0 | xargs -0 grep "chậm" – MediaVince

2

Nếu bạn muốn làm 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 
Các vấn đề liên quan