Làm cách nào để grep cho một chuỗi đệ quy thông qua tất cả .gz
các tệp trong tất cả các thư mục và thư mục con?
Làm cách nào để grep cho một chuỗi đệ quy thông qua tất cả .gz
các tệp trong tất cả các thư mục và thư mục con?
Câu trả lời:
@Steve Weet gần như ở đó. Việc sử dụng / dev / null làm đối số bổ sung là một cách hay để buộc tên tệp được hiển thị (tôi sẽ nhớ điều đó, cảm ơn Steve) nhưng nó vẫn chạy tệp thực thi cho mọi tệp được tìm thấy - một chi phí rất lớn.
Bạn muốn chạy zgrep ít nhất có thể, tận dụng tối đa mỗi lần thực hiện:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
sẽ cung cấp càng nhiều đối số (tên tệp) càng tốt cho zgrep và liên tục thực thi nó cho đến khi nó sử dụng tất cả các tệp được cung cấp bởi find
lệnh. Sử dụng các tùy chọn -print0
và -0
cho phép nó hoạt động nếu có khoảng trắng trong bất kỳ tên tệp hoặc thư mục nào.
Trên Mac OS X, bạn có thể đạt được hiệu ứng tương tự mà không cần xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
để luôn hiển thị tên tệp với dòng phù hợp, trong GNU grep ít nhất.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Vì vậy, một cái gì đó như
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
để đi qua một cái cây hoặc nếu -r không hoạt động, dẫn đầu ra của tìm kiếm thông quaxargs zgrep
/bin/zgrep: -r: option not supported
trên hệ thống Ubuntu mới cài đặt của tôi.
xargs
thay thế sau đó.
@aioobe gần hết rồi. Lệnh sẽ thực hiện công việc nhưng sẽ không cho bạn biết tên tệp
Sau đây sẽ cho bạn biết tên tệp là:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
Việc thêm vào /dev/null
sẽ đảm bảo zgrep nhìn thấy hai tên tệp để nó hiển thị cho bạn tên của tệp nếu tìm thấy chuỗi
BIÊN TẬP
Nghiên cứu sâu hơn cho thấy rằng đối với máy của tôi (OS / X), -exec
đối số cần tìm sẽ thêm càng nhiều tên tệp càng tốt (tương tự như cách xargs
ứng xử).
-exec
- Tôi hoàn toàn nói về tính di động nên tôi sẽ không sử dụng nó trong một tập lệnh, nhưng tuyệt vời cho dấu nhắc lệnh.
find
, nhưng hầu hết các phiên bản hiện đại (ví dụ như trong các bản phân phối dựa trên Debian).
-H
để luôn hiển thị tên tệp với dòng phù hợp, ít nhất là trong GNU grep, thay vì /dev/null
hack.