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 中)。
don*_*sti 167
请注意,最近(2013 年 6 月)发布的“接受 --keep (-k) 选项,以与 xz、lzip 和 bzip2 等工具保持一致。使用此选项,gzip 在压缩或解压缩时不再删除命名输入文件”。gzip-1.6
摘自手册页:
Run Code Online (Sandbox Code Playgroud)-k --keep Keep (don't delete) input files during compression or decompression.
因此,从 开始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。
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)