Có rất nhiều nhầm lẫn ở đây vì không chỉ có một zgrep
. Tôi có hai phiên bản trên hệ thống của mình, zgrep
từ gzip
và zgrep
từ zutils
. Các cựu chỉ là một kịch bản bao bọc mà gọi gzip -cdfq
. Nó không hỗ trợ -r, --recursive
chuyển đổi. 1
Sau đó là một c++
chương trình và nó hỗ trợ các -r, --recursive
tùy chọn.
Chạy zgrep --version | head -n 1
sẽ tiết lộ cái nào (nếu có) trong số chúng là mặc định:
zgrep (gzip) 1.6
là tập lệnh bao bọc,
zgrep (zutils) 1.3
là cpp
thực thi.
Nếu bạn có cái sau bạn có thể chạy:
zgrep 'pattern' -r --format=gz /path/to/dir
Dù sao, như đã đề xuất, find
+ zgrep
sẽ hoạt động tốt như nhau với cả hai phiên bản zgrep
:
find /path/to/dir -name '*.gz' -exec zgrep -- 'pattern' {} +
Nếu zgrep
bị thiếu trong hệ thống của bạn (rất khó xảy ra), bạn có thể thử với:
find /path/to/dir -name '*.gz' -exec sh -c 'gzip -cd "$0" | grep -- "pattern"' {} \;
nhưng có một nhược điểm lớn: bạn sẽ không biết các trận đấu diễn ra ở đâu vì không có tên tệp nào được đặt trước các dòng khớp.
1: bởi vì nó sẽ có vấn đề
zgrep
:zgrep - search possibly compressed files for a regular expression