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

Man*_*lva 243 command-line gzip files

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

gzip file.txt
Run Code Online (Sandbox Code Playgroud)

导致修改此文件并重命名它file.txt.gz。而不是这种行为,除了现有的file.txt. 现在我使用以下命令来做到这一点

gzip -c file.txt > file.txt.gz
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 273

对于 GNU gzip1.6 或更高版本、FreeBSD 和衍生产品或 NetBSD 的最新版本,请参阅don_cristi 的回答

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

gzip < file > file.gz
Run Code Online (Sandbox Code Playgroud)

当没有给出任何参数时,gzip读取其标准输入,压缩它并将压缩版本写入其标准输出。作为奖励,当使用 shell 重定向时,您不必担心被调用的文件"--help""-"(后一个仍然是 的问题gzip -c --)。

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

相对于A显著差别gzip -k是,虽然会出现在复制没有尝试file的元数据(所有权,权限,修改时间,未压缩的文件名)file.gz

此外,如果file.gz已经存在,它将悄悄地覆盖它,除非您noclobber在 shell 中打开了该选项(set -o noclobber例如在 POSIX shell 中)。

  • 请注意,&lt; 和 &gt; 实际上应该输入到命令中,并不代表文件名的占位符 (10认同)
  • 现在这解决了 OP 问题的细节并回答了一般问题“如何告诉 gzip 保留原始文件”。非常方便,比 `-c` 更有用。 (4认同)

don*_*sti 167

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

摘自手册页:

  -k --keep
         Keep (don't delete) input files during compression or decompression.
Run Code Online (Sandbox Code Playgroud)

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

gzip -k -- "$file"
Run Code Online (Sandbox Code Playgroud)

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

这种选择是首先在FreeBSD下实现的介绍gzip(在FreeBSD的7.0,2007年)的一致性bzip2。这gzip是基于gzipNetBSD对 GNU 的重写。该-k选项最终在 2010 年回到 NetBSD

  • 天啊。RHEL6 只在 base 中带有 zip 1.3.12... (13认同)
  • @notilas 见 https://unix.stackexchange.com/q/11376/22142 (3认同)

Mat*_*teo 31

从文档中似乎没有创建文件副本的选项。

你可以定义一个shell函数

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

进而

gzipkeep file.txt
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果文件是`-`,则必须将其称为`gzipkeep ./-`。 (2认同)