我想使用gzip命令行工具压缩文本文件,同时保留原始文件。默认情况下运行以下命令
gzip file.txt
导致修改此文件并重命名file.txt.gz
。除了现有的以外,我还想拥有这个新的压缩文件file.txt
。现在,我正在使用以下命令来执行此操作
gzip -c file.txt > file.txt.gz
它有效,但是我想知道为什么没有更简单的解决方案来完成这样的常见任务?也许我错过了这样做的选择?
我想使用gzip命令行工具压缩文本文件,同时保留原始文件。默认情况下运行以下命令
gzip file.txt
导致修改此文件并重命名file.txt.gz
。除了现有的以外,我还想拥有这个新的压缩文件file.txt
。现在,我正在使用以下命令来执行此操作
gzip -c file.txt > file.txt.gz
它有效,但是我想知道为什么没有更简单的解决方案来完成这样的常见任务?也许我错过了这样做的选择?
Answers:
对于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
在外壳中打开了该选项(set -o noclobber
例如在POSIX Shell中已打开)。
-c
。
-k
选择?在手册页中找不到它,例如linux.die.net/man/1/gzip中的此版本。同样,默认情况下,gzip看起来会复制文件的元数据。
请注意,最近(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"
(请注意,如果$file
is 不起作用-
(它将gzip
解释为stdin而不是实际的名为的文件-
),在这种情况下,您必须将其更改为./-
)
为了与保持一致,该选项首先在FreeBSD实现中gzip
(在2007年的FreeBSD 7.0中)引入bzip2
。那gzip
是基于gzip
NetBSD 对GNU的重写。该-k
选件最终于2010年重新使用NetBSD。
从文档看来,似乎没有选择来创建文件的副本。
您可以定义一个外壳函数
gzipkeep() {
if [ -f "$1" ] ; then
gzip -c -- "$1" > "$1.gz"
fi
}
接着
gzipkeep file.txt
-
,则必须将其称为gzipkeep ./-
。