Làm thế nào để nói với gzip để giữ tập tin gốc?


210

Tôi muốn nén một tệp văn bản bằng công cụ dòng lệnh gzip trong khi vẫn giữ tệp gốc. Theo mặc định chạy lệnh sau

gzip file.txt

dẫn đến sửa đổi tập tin này và đổi tên nó file.txt.gz. thay vì hành vi này tôi muốn có file nén mới này trong Ngoài ra để một trong những tồn tại file.txt. Bây giờ tôi đang sử dụng lệnh sau để làm điều đó

gzip -c file.txt > file.txt.gz

Nó hoạt động nhưng tôi tự hỏi tại sao không có giải pháp dễ dàng hơn để làm một nhiệm vụ chung như vậy? Có lẽ tôi đã bỏ lỡ lựa chọn làm điều đó?


3
Điều này là do, gzip nén tệp đã cho và tạo tệp mới. Nén có nghĩa là ép tập tin gốc và thay thế nó bằng tập tin mới. Tùy chọn "-c" của bạn rõ ràng là nói với gzip để lưu nó với tên khác. Đó là lý do tại sao nó hoạt động
SHW

@SHW Tôi không nhận được bình luận của bạn ...?
Manuel Selva

@ManuelSelva khi tệp gốc được nén, nó không còn cần thiết nữa, tôi đoán đó là thiết kế.
cúc

2
Tại sao gzip / gunzip lại làm điều này theo mặc định khi không có công cụ unix nào khác thực hiện việc này ngoài tôi.
Mateen Ulhaq

Câu trả lời:


247

Đối với GNU gzip1.6 trở lên, FreeBSD và các dẫn xuất hoặc các phiên bản gần đây của NetBSD, xem câu trả lời của don_cristi .

Với bất kỳ phiên bản nào, bạn có thể sử dụng chuyển hướng shell như trong:

gzip < file > file.gz

Khi không đưa ra bất kỳ đối số nào, hãy gzipđọc đầu vào tiêu chuẩn của nó, nén nó và ghi phiên bản nén vào đầu ra tiêu chuẩn của nó. Như một phần thưởng, khi sử dụng chuyển hướng shell, bạn không phải lo lắng về các tệp được gọi "--help"hoặc "-"(cái sau này vẫn còn là một vấn đề đối với gzip -c --).

Một lợi ích khác gzip -c file > file.gzlà nếu filekhông thể mở được, lệnh sẽ thất bại nếu không tạo một khoảng trống file.gz(hoặc ghi đè lên hiện có file.gz) và hoàn toàn không chạy gzip.

Một sự khác biệt đáng kể so với gzip -kmặc dù là sẽ không có nỗ lực sao chép filesiêu dữ liệu (quyền sở hữu, quyền, thời gian sửa đổi, tên của tệp không nén) sang file.gz.

Ngoài ra, nếu file.gzđã tồn tại, nó sẽ âm thầm ghi đè lên trừ khi bạn đã bật noclobbertùy chọn trong vỏ của mình ( set -o noclobberví dụ như trong vỏ POSIX).


4
Bây giờ điều này giải quyết các chi tiết cụ thể của câu hỏi của OP và trả lời câu hỏi chung "Cách nói với gzip để giữ tệp gốc". Rất tiện dụng và hữu ích hơn -c.
mã hóa

8
Lưu ý rằng <và> thực sự được cho là đã nhập vào lệnh và không đại diện cho trình giữ chỗ cho tên tệp
Gaurav Gupta

Là gì -klựa chọn? Không thể tìm thấy nó trong các trang man, ví dụ: phiên bản này ở đây linux.die.net/man/1/gzip . Ngoài ra, có vẻ như gzip sao chép siêu dữ liệu của tệp theo mặc định.
Flow2k

1
@ Flow2k, đó là liên kết đến câu trả lời của don_cristi.
Stéphane Chazelas

à, tôi thấy nó trên macos của tôi nhưng thật tệ, nó không phải trên RHEL hay Ubuntu. Cảm ơn.
Flow2k

138

Lưu ý rằng gần đây (tháng 6 năm 2013) đã phát hành "chấp nhận tùy chọn --keep (-k), để thống nhất với các công cụ như xz, lzip và bzip2. Với tùy chọn này, gzip không còn xóa các tệp đầu vào có tên khi nén hoặc giải nén" .gzip-1.6

Trích từ trang người đàn ông:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

Vì vậy, kể từ khi 1.6bạn có thể sử dụng -khoặc --keepgiữ tệp gốc:

gzip -k -- "$file"

(lưu ý rằng nó không hoạt động nếu $file-(có gzipnghĩa là stdin thay vì tệp thực tế được gọi -), trong trường hợp đó, bạn phải thay đổi nó thành ./-)

Tùy chọn đó lần đầu tiêngzip được giới thiệu trong triển khai FreeBSD (trong FreeBSD 7.0 năm 2007) để thống nhất với bzip2. Điều đó gzipdựa trên việc viết lại GNU gzipbởi NetBSD. Các -ktùy chọn cuối cùng đã làm cho nó trở lại NetBSD trong năm 2010 .


10
Trời ạ. RHEL6 chỉ đi kèm với zip 1.3.12 trong cơ sở ...
Nicholas Tolley Cottrell

Điều này hoạt động trên Mac / OS X :) (đó là BSD)
paul

Có nhiều distro tiêu chuẩn không sử dụng> = 1.6 nữa không? Tự hỏi nếu câu trả lời cần cập nhật
MichaelChirico

Để làm gi? Tôi nghĩ gzip -k "file" hoạt động tốt.
notilas


30

Từ tài liệu có vẻ như không có tùy chọn để tạo một bản sao của tệp.

Bạn có thể định nghĩa hàm shell

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

và sau đó

gzipkeep file.txt

2
Lưu ý rằng nếu tập tin là -, bạn phải gọi nó là gzipkeep ./-.
Stéphane Chazelas
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.