如何告诉gzip保留原始文件?


210

我想使用gzip命令行工具压缩文本文件,同时保留原始文件。默认情况下运行以下命令

gzip file.txt

导致修改此文件并重命名file.txt.gz除了现有的以外,我还想拥有这个新的压缩文件file.txt。现在,我正在使用以下命令来执行此操作

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

它有效,但是我想知道为什么没有更简单的解决方案来完成这样的常见任务?也许我错过了这样做的选择?


3
这是因为,gzip压缩给定文件并创建新文件。压缩意味着压缩原始文件并用新文件替换。您的“ -c”选项明确告诉gzip使用其他名称保存它。这就是它起作用的原因
SHW 2012年

@SHW我没有收到您的评论...?
曼努埃尔·塞尔瓦

@ManuelSelva一旦原始文件被压缩,就不再需要了,我想这就是设计。
雏菊

2
为什么gzip / gunzip 在没有其他unix工具可以做到这一点时默认执行此操作。
Mateen Ulhaq '18

Answers:


247

对于GNU gzip1.6或更高版本,FreeBSD及其衍生版本或NetBSD的最新版本,请参见don_cristi的答案

对于任何版本,您都可以使用shell重定向,如下所示:

gzip < file > file.gz

如果未提供任何参数,则gzip读取其标准输入,对其进行压缩,然后将压缩后的版本写入其标准输出。另外,在使用shell重定向时,您不必担心称为"--help"或的文件"-"(后者仍然是的问题gzip -c --)。

另一个好处gzip -c file > file.gz是,如果file无法打开,则该命令将失败,而不会创建一个空file.gz(或覆盖现有file.gz)并且完全不运行gzip

与相比,一个重要的区别gzip -k是不会尝试将file的元数据(所有权,权限,修改时间,未压缩文件的名称)复制到file.gz

同样,如果file.gz已经存在,它将静默覆盖它,除非您noclobber在外壳中打开了该选项(set -o noclobber例如在POSIX Shell中已打开)。


4
现在,这解决了OP问题的细节,并回答了“如何告诉gzip保留原始文件”这一一般性问题。非常方便,比有用-c
codewaggle

8
请注意,<和>实际上应该键入命令中,并不代表文件名的占位符
Gaurav Gupta

有什么-k选择?在手册页中找不到它,例如linux.die.net/man/1/gzip中的此版本。同样,默认情况下,gzip看起来会复制文件的元数据。
flow2k

1
@ flow2k,这是don_cristi的答案的链接。
斯特凡Chazelas

嗯,我在macOS上看到了它,但很遗憾,它不在RHEL或Ubuntu上。谢谢。
flow2k

138

请注意,最近(2013年6月)发布的“接受--keep(-k)选项,以与xz,lzip和bzip2之类的工具保持一致。使用此选项,gzip不再在压缩或解压缩时删除命名的输入文件”gzip-1.6

手册页摘录:

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

因此,从开始1.6,您可以使用-k--keep保留原始文件:

gzip -k -- "$file"

(请注意,如果$fileis 不起作用-(它将gzip解释为stdin而不是实际的名为的文件-),在这种情况下,您必须将其更改为./-

为了与保持一致,该选项首先在FreeBSD实现中gzip(在2007年的FreeBSD 7.0中)引入bzip2。那gzip是基于gzipNetBSD 对GNU的重写。该-k选件最终于2010年重新使用NetBSD


10
真是的 RHEL6仅在基础版中随附了1.3.12 zip ...
Nicholas Tolley Cottrell 2013年

这适用于Mac / OS X:)(是BSD)
保罗

是否有许多标准发行版不再使用> = 1.6?想知道答案是否需要更新
MichaelChirico

“-”是什么意思?我认为gzip -k“文件”可以正常工作。
notilas


30

从文档看来,似乎没有选择来创建文件的副本。

您可以定义一个外壳函数

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

接着

gzipkeep file.txt

2
请注意,如果文件为-,则必须将其称为gzipkeep ./-
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.