有没有办法强制gzip不要覆盖冲突文件?


17

我正在写一个脚本,我正在抓取文件。

我可能会压缩文件,创建一个同名的文件,并尝试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调用该选项,否则不会覆盖。


3
我不确定gzip是如何检查后台的,但是在我正在处理的系统上添加bash中的'&'并没有这样做。然而,在管道的另一边似乎工作,所以而不是: find ./ ! -name "*gz" -exec gzip {} \; & 这工作: find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip gzip报告: gzip: ./2012-July.txt.gz already exists; not overwritten
Bill McGonigle 2015年

1
@BillMcGonigle你的评论应该是答案!
Rockallite

Answers:


9

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

例如:

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

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

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

不幸的是,这是作为perl脚本中的系统命令运行的(长篇故事讲述为什么我们不使用像IO :: Compress :: Gzip这样的东西,相信我,我已经考虑过了)。压缩命令本身存储在配置文件中。你的后一个命令看起来接近我需要的,但我认为我已经找到了一些能够更好地满足我需求的东西。我将接受你的答案,因为这是一个比我更好的通用解决方案,但请参阅下面我实际将要使用的内容。
Barton Chittenden 2013年

你可以用Perl戳一个文件...
ЯрославРахматуллин2013年

1
我不清楚你的意思poke a file
Barton Chittenden

在美国英语的日常交流中缺乏关联/图像使用让我每次都感到惊讶:)让我试着解释一下。制作一个孩子用棍子戳死了乌鸦的图像,看看它是否还活着。Poking用于在这里探测属性。同样,戳一个文件,就意味着检查一些事情,比如,如果它是完全存在。无论如何,我觉得戳戳的行为至少应该意味着“与外部物体接触”足以说明“用文件获取一些文件的信息”,而不是拼写出来。
ЯрославРахматуллин2013年

“poke”通常是用于设置内存位置的黑客俚语。请参阅:en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Bill McGonigle 2015年

12

我能找到的最接近一个命令的是:

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命令的直接替换的特殊需求,它位于配置文件中。


1
另一个令人烦恼的是gzip退出2
史蒂文潘尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.