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

gzip file.txt


会导致修改此文件并重命名file.txt.gz。除了现有的file.txt之外,我还想拥有这个新的压缩文件,而不是这种行为。现在,我正在使用以下命令来做到这一点

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


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

评论

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

@SHW我没收到您的评论...?

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

为什么gzip / gunzip在没有其他unix工具可以做到这一点的情况下默认执行此操作?

#1 楼

对于GNU gzip 1.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选项在您的外壳中打开(例如在POSIX外壳中带有set -o noclobber)。

评论


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

– codewaggle
2012年12月18日在21:20

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

–盖拉夫·古普塔(Gaurav Gupta)
2015年2月23日在11:32

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

– flow2k
18年6月29日在18:15

@ flow2k,这是don_cristi的答案的链接。

–StéphaneChazelas
18年6月29日在21:46

@StéphaneChazelas也在gzip 1.4版上工作。猫文件| gzip> file.gz

–吉普赛宇航员
19年6月23日在12:30



#2 楼

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

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


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

(请注意,如果$file-gzip解释为含义stdin而不是称为-的实际文件)不起作用,在这种情况下,您必须将其更改为./-
首次在gzip的FreeBSD实现中引入(在2007年的FreeBSD 7.0中),以与bzip2保持一致。该gzip基于NetBSD对GNU gzip的重写。 -k选件最终于2010年重新用于NetBSD。

评论


真是的RHEL6仅在基本版本中随附zip 1.3.12。

–尼古拉斯·托利·科特雷尔
2013年6月25日14:36

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

–保罗
16年6月29日在23:56

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

– MichaelChirico
17年11月28日在16:31

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

–notilas
18-09-19在18:04

@notilas参见unix.stackexchange.com/q/11376/22142

–don_crissti
18-09-19在18:30

#3 楼

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

您可以定义shell函数

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


,然后

gzipkeep file.txt


评论


请注意,如果文件是-,则必须将其称为gzipkeep ./-。

–StéphaneChazelas
2014年1月7日17:13

这是脚本IMO的最佳解决方案,因为您可以确保输出文件>“ $ 1.gz”的存在与指定的完全相同。此外,如果需要,您还可以指定其他名称。

– Maxxim
20 Sep 19'8:10