我想使用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 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中已打开)。
-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"
(请注意,如果$fileis 不起作用-(它将gzip解释为stdin而不是实际的名为的文件-),在这种情况下,您必须将其更改为./-)
为了与保持一致,该选项首先在FreeBSD实现中gzip(在2007年的FreeBSD 7.0中)引入bzip2。那gzip是基于gzipNetBSD 对GNU的重写。该-k选件最终于2010年重新使用NetBSD。
从文档看来,似乎没有选择来创建文件的副本。
您可以定义一个外壳函数
gzipkeep() {
if [ -f "$1" ] ; then
gzip -c -- "$1" > "$1.gz"
fi
}
接着
gzipkeep file.txt
-,则必须将其称为gzipkeep ./-。