gzip file.txt
会导致修改此文件并重命名
file.txt.gz
。除了现有的file.txt
之外,我还想拥有这个新的压缩文件,而不是这种行为。现在,我正在使用以下命令来做到这一点gzip -c file.txt > file.txt.gz
它可以工作,但是我想知道为什么没有更简单的解决方案来完成这样的常见任务?也许我错过了这样做的选择?
#1 楼
对于GNUgzip
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
评论
这是因为,gzip压缩给定文件并创建新文件。压缩意味着压缩原始文件并用新文件替换。您的“ -c”选项明确告诉gzip使用其他名称保存它。这就是为什么它起作用的原因@SHW我没收到您的评论...?
@ManuelSelva一旦原始文件被压缩,就不再需要了,我想这就是设计。
为什么gzip / gunzip在没有其他unix工具可以做到这一点的情况下默认执行此操作?