所以我的文件夹中有.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
。它将以线性方式沿着输入列表向下工作,因此交错应该按照您想要的方式分散负载。