Sử dụng gzip để nén các tệp trong một thư mục ngoại trừ các tệp .gz đã có


19

Tôi có một thư mục các bản ghi mà tôi muốn thiết lập một công việc để nén bằng gzip . Vấn đề là tôi không muốn giải nén các nhật ký mà tôi đã nén.

Tôi đã thử sử dụng ls | grep -v gz | gzip, nhưng nó dường như không hoạt động.

Có cách nào để làm việc này không? Về cơ bản tôi muốn gzip mọi tập tin trong thư mục không kết thúc bằng .gz.

Câu trả lời:


26

Bạn chỉ có thể làm:

gzip *

gzip sẽ cho bạn biết nó bỏ qua các tệp đã có .gz kết thúc.
Nếu thông báo đó theo cách bạn có thể sử dụng:

gzip -q *

Những gì bạn đã thử không hoạt động, vì gzipkhông đọc tên tệp của các tệp để nén từ stdin, để làm việc đó bạn sẽ phải sử dụng:

ls | grep -v gz | xargs gzip

Bạn sẽ loại trừ các tệp có mẫu gzở bất kỳ đâu trong tên tệp, không chỉ ở cuối .¹ Bạn cũng phải lưu ý rằng phân tích cú pháp đầu ra lslà nguy hiểm khi bạn có tên tệp có dấu cách, dòng mới, v.v.

Một giải pháp sạch hơn, không dựa vào gzipviệc bỏ qua các tệp có .gzkết thúc là, cũng xử lý các tệp không nén trong thư mục con:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ Như izkatanhận xét: sử dụng .gzmột mình để cải thiện điều này, sẽ không làm việc. Bạn sẽ cần phải sử dụng grep -vF .gzhoặc grep -v '\.gz$'. Điều đó vẫn để lại nguy cơ xử lý ls'đầu ra


1
"... Điều đó làm cho nó ít có khả năng khớp với một phần bên trong của tên tệp" - đó là grep, chỉ cần sử dụng $để nó rõ ràng hơn. Và .dù sao bạn cũng không thoát , vì vậy sẽ chỉ loại trừ các tệp bắt đầu bằng gz(vì chúng không có "bất kỳ ký tự nào trước đó gz")
Izkata

1
@Izkata: Không có, bao gồm cả các dấu chấm không thoát và không neo regex với $sẽ loại trừ ( -v) tất cả các file có tên gồm ba hoặc nhiều ký tự bao gồm bất kỳ ký tự tiếp theo là "gz" bất cứ nơi nào trong tên tập tin. Vì vậy, nó sẽ bao gồm các tệp có tên bắt đầu bằng "gz".
Tạm dừng cho đến khi có thông báo mới.

1
@DennisWilliamson Nhận xét cuối cùng của tôi không rõ ràng, nó cũng sẽ loại trừ các tệp có gzbất kỳ vị trí nào trong tên (ngoại trừ phần bắt đầu). Vì vậy, tốt hơn hết là neo nó lại. Chưa sử dụng $, nó đọc như thể bạn không nhận ra điều gì .có nghĩa là trong một biểu thức chính quy, do đó phần còn lại của nhận xét khó hiểu.
Izkata
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.