Bash脚本 - 并行解压缩并等待结束

时间:2017-07-18 14:06:53

标签: bash gz gunzip

我需要解压缩一些档案,我想加快这个过程。 这是我的剧本:

for archive in $path; do

    STEM=$(basename "${archive}" .gz)
    gunzip -c $archive > $here/$STEM

done

for file in `ls "$here"`; do
     ... processing ...
done

有没有办法一次解压缩多个(所有)档案并等待完成?

换句话说,我需要这样的东西:

for archive in $path; do

    ... parallel unzip ...

done

WAIT

for file in `ls "$here"`; do
     ... processing ...
done

由于

2 个答案:

答案 0 :(得分:3)

你可以用这样的 GNU Parallel 简洁明了地做到这一点:

parallel 'gunzip -c {} > "$here/$(basename {} .gz)"' ::: $path

请使用小目录中的一些文件的副本进行测试,直到您掌握它为止。

如果要解压缩10,000个文件,这不会突然启动10,000 unzip个作业 - 相反,如果您说有8个CPU核心,它将一次运行8个unzip个进程,直到所有10,000个完成。您可以将一次更改的作业数更改为固定数,或可用CPU的某个百分比。

您还可以使用parallel --progress ...parallel --bar ...获取进度表。

你也可以要求 GNU Parallel 告诉你如何在不做任何事情的情况下使用parallel --dry-run ...

答案 1 :(得分:1)

在枪口之后放一个&符号:

for archive in $path; do

    STEM=$(basename "${archive}" .gz)
    gunzip -c $archive > $here/$STEM &

done

wait