同时在两个文件夹中并行解压缩 .lzo 文件,然后删除原始 .lzo 文件

同时在两个文件夹中并行解压缩 .lzo 文件,然后删除原始 .lzo 文件

所以我的文件夹中有.lzo文件/test01/primary需要解压缩,然后删除所有.lzo文件。我/test02/secondary也需要在文件夹中做同样的事情。两个文件夹中大约有 150 个.lzo文件,总共大约有 300 个.lzo文件。

从命令行我像这样运行到未压缩的一个文件lzop -d file_name.lzo

.lzo解压缩所有文件然后.lzo同时删除两个文件夹中的所有文件的最快方法是什么?下面是我的代码:

#!/bin/bash

set -e

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary

parallel lzop -dU -- ::: {"$PRIMARY","$SECONDARY"}/*.lzo

我想.lzo同时解压缩和删除主文件夹和辅助文件夹中的文件。使用我上面的代码,它首先在 PRIMARY 文件夹中执行,然后在 SECONDARY 文件夹中执行。如何同时在 PRIMARY 和 SECONDARY 中实现并行?

另外,它是否会解压缩所有文件,然后稍后删除,或者解压缩一个文件,然后删除该文件,然后移至下一个文件?

我尝试过这个,但它不起作用。它只适用于前 40 个文件,之后就根本不起作用了。

#!/bin/bash

set -e

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary

parallel -j 40 lzop -dU -- ::: "$PRIMARY"/*.lzo &
parallel -j 40 lzop -dU -- ::: "$SECONDARY"/*.lzo &
wait

答案1

如果我理解正确,您想要并行化两个目录,但平衡(大概)两个存储设备之间的负载?

最简单的解决方案可能是将输入中的文件名交错为并行:

paste -d'\n' <(ls "$PRIMARY"/*.lzo) <(ls "$SECONDARY"/*.lzo) | parallel lzop -dU --
  • paste命令从每个文件中获取一行,通常将它们并排放置在输出文件中,但这里我们使用\n作为分隔符,因此它们最终会以交错的行结束。

  • <(...)bash 语法将一个命令输出“管道”到另一个命令中,就像它是一个文件一样(我认为它使用临时命名管道),这允许我们一次管道输入两个。

  • 如果未给出,parallel 从 stdin 读取文件名;:::如果未给出,则每个 CPU 运行一项作业-j。它将以线性方式沿着输入列表向下工作,因此交错应该按照您想要的方式分散负载。

相关内容