检查数千个gzip文件的最快方法



我创建这个片段是为了在文件夹中循环,检查是否有无效的gz文件,并通过再次对其进行gz封装来修复它。这很好,但前提是只有几个文件。如果有数千个文件,这需要很长时间。

有没有更优化的方法可以做到这一点。

fix_corrupt_files()
{
dir=$1

for f in $dir/*.gz
do

if gzip -t $f;
then :
else
log "$(basename $f) is corrupt"
base="$(basename $f .gz)"
log "fixing file"
mv $f $dir/$base
gzip $dir/$base
log "file fixed"
fi

done
}

这应该会给你一点速度:

fix_corrupt_files()
{
dir="$1"

for f in "$dir"/*.gz
do 
{
if gzip -t "$f";
then :
else
log "$(basename "$f") is corrupt"
base="$(basename "$f" .gz)"
log "fixing file"
mv "$f" "$dir/$base"
gzip "$dir/$base"
log "file fixed"
fi
} &
done
wait # wait for all background processes to terminate
}

请注意,我假设gzip命令是您的慢速部分。

我在这里真正做的只是在后台运行if语句(使用{...}&(。因此,基本上,函数中的每个if语句都将并行运行。函数末尾有一个wait,因此在所有子进程完成之前,它不会离开函数。这可能适合也可能不适合您的用例。还要注意,log将被调用,基本上是随机的,并且可能是无序的。同样,这确实取决于您的用例是否重要。

还要注意的是,我在应该的地方添加了双引号。看起来你确信你的文件名中没有空格,但这让我很焦虑。

编辑:还要注意,这可能会使您的机器屈服。我对gzip不够熟悉,不知道它的资源密集程度。我也不知道你的档案有多大。如果这成为一个问题,您可以添加一个循环计数器,该计数器每X次迭代调用wait

最新更新