我创建这个片段是为了在文件夹中循环,检查是否有无效的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
。