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, zgreptừ gzipvà zgreptừ 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, --recursivechuyển đổi. 1
Sau đó là một c++chương trình và nó hỗ trợ các -r, --recursivetùy chọn.
Chạy zgrep --version | head -n 1sẽ 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à cppthự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+ zgrepsẽ 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 zgrepbị 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