有没有办法强制 gzip 在发生冲突时不覆盖文件?

有没有办法强制 gzip 在发生冲突时不覆盖文件?

我正在编写一个脚本,用于对文件进行 gzip 压缩。

我可能会压缩一个文件,创建一个同名的文件,然后尝试对其进行 gzip 压缩,例如

$ ls -l archive/
total 4
-rw-r--r-- 1 xyzzy xyzzy  0 Apr 16 11:29 foo
-rw-r--r-- 1 xyzzy xyzzy 24 Apr 16 11:29 foo.gz

$ gzip archive/foo
gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)? n   
    not overwritten

通过使用gzip --force,我可以强制 gzip 覆盖foo.gz,但在这种情况下,我认为如果覆盖 ,我很有可能会丢失数据foo.gz。似乎没有命令行开关可以强制 gzip 保留.gz文件......在提示符下按“n”的非交互式版本。

我尝试了gzip --noforcegzip --no-force,希望这些可能遵循 GNU 选项标准,但这些都没有起作用。

有没有直接的解决方法?

编辑:

事实证明,这是阅读信息页而不是手册页更有价值的时候之一。

从信息页面:

`--force'
`-f'
     Force compression or decompression even if the file has multiple
     links or the corresponding file already exists, or if the
     compressed data is read from or written to a terminal.  If the
     input data is not in a format recognized by `gzip', and if the
     option `--stdout' is also given, copy the input data without
     change to the standard output: let `zcat' behave as `cat'.  If
     `-f' is not given, and when not running in the background, `gzip'
     prompts to verify whether an existing file should be overwritten.

手册页缺少文本并且不在后台运行时

当在后台运行时,gzip 不会提示,并且除非-f调用该选项,否则不会覆盖。

答案1

我意识到避免不良影响的最好方法是不是要求程序执行不想要的效果。也就是说,如果文件已经以压缩格式存在,则不要告诉它压缩文件。

例如:

if [ ! -f "$file.gz" ]; then 
    gzip "$file"; 
else 
    echo "skipping $file"
fi

或更短(true如果有文件 .gz 则运行,否则压缩文件)

[ -f "$file.gz" ] && echo "skipping $file" || gzip "$file"    

答案2

我能找到的最接近单个命令的是以下内容:

yes n | gzip archive/foo

yes命令会打印y并随后将换行符发送到 stdout,直到收到信号。如果它有参数,它将打印该参数而不是y。在本例中,它会一直打印n直到 gzip 退出,从而关闭管道。

这相当于n在键盘上反复输入;这将自动回答问题gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

一般来说,我认为如果相应的 gzip 文件存在,最好不要尝试压缩文件;我的解决方案比较嘈杂,但它适合我对命令的特定需求gzip,位于配置文件中。

答案3

尝试:

gzip -d -r ./folder && gzip -r ./folder

相关内容