gunzip即使知道文件名也找不到文件

时间:2014-07-11 17:32:29

标签: bash zip gzip

我有一个简单的bash脚本,可以解压缩目录中的一堆文件:

#!/bin/bash

dir=/volatile/huanlab/bold/kendal/bioinformatics_database/tmp/compound
gunzip -f $dir/*gz*

然而,当我运行此命令时,我得到了这些错误:

gzip: /volatile/huanlab/bold/kendal/bioinformatics_database/tmp/compound/Compound_012650001_012675000.sdf.gz: No such file or directory
gzip: /volatile/huanlab/bold/kendal/bioinformatics_database/tmp/compound/Compound_012675001_012700000.sdf.gz: No such file or directory
gzip: /volatile/huanlab/bold/kendal/bioinformatics_database/tmp/compound/Compound_012700001_012725000.sdf.gz: No such file or directory
gzip: /volatile/huanlab/bold/kendal/bioinformatics_database/tmp/compound/Compound_012725001_012750000.sdf.gz: No such file or directory
... [this continues on for every file in the directory]

显然它正在查找目录中的每个文件,因为文件名列在错误中,但是它无法解压缩它们并且说找不到文件。这是怎么回事?

编辑某些文件实际上已解压缩,但仍显示该文件的错误

1 个答案:

答案 0 :(得分:2)

我想我找到了可能的原因:当你运行gunzip -f $dir/*gz*时,文件会被扩展并作为参数传递给gunzip。文件名扩展只发生一次,不是动态的。即使文件被删除或重命名,参数仍然是它们的方式。不知怎的,如果你的某些文件在gzip开始处理之前被删除(由于解压缩每个文件在到达另一个文件之前需要花费一些时间),那么肯定会出现这些消息。

要防止这些消息,您可以在处理之前检查每个文件是否仍然存在:

for file in "$dir"/*gz; do
    [[ -f $file ]] && gunzip -f "$file"
done
  • 更好地引用$dir以防止分词。
  • 如果目标文件名是以gz结尾的文件名,则最后不要额外*