我有一个 A_1 文件夹,一个 A_2 文件夹,一个 A_3 文件夹.....直到 A_561 文件夹。
每个文件夹都有一个包含 B_1 , B_2 , B_3 ...和 B_34 < / em>文件夹。
在 B_1 文件夹中,有名为 F_1_1.txt , F_1_2.txt ... F_1_38.txt < / em>。 F_2_1.txt , F_2_1.txt ... F_2_38.txt 。
在 B_2 文件夹中,有名为 F_1_1.txt , F_1_2.txt ... F_1_38.txt < / em>。 F_2_1.txt , F_2_1.txt ... F_2_38.txt 。
在 B_2 文件夹中,有名为 F_1_1.txt , F_1_2.txt ... F_1_38.txt < / em>。 F_2_1.txt , F_2_1.txt ... F_2_38.txt 。
然后,我将运行一个java
程序来处理这些文件:
java -jar beagle.28Sep18.793.jar \
gt=/A_1/B_1/F_1_1.txt /A_1/B_1/F_2_1 out=/C/test_1.out;.....
java -jar beagle.28Sep18.793.jar \
gt=/A_1/B_2/F_1_2.txt /A_1/B_2/F_3_2 out=/C/test_2.out;.....
java -jar beagle.28Sep18.793.jar \
gt=/A_2/B_3/F_3_1.txt /A_2/B_3/F_4_1 out=/C/test_3.out;
java -jar beagle.28Sep18.793.jar \
gt=/A_3/B_1/F_1_38.txt /A_3/B_1/F_1_38 out=/C/test_4.out;
我可以运行for
循环bash来通过
for folder in $(seq 561); do
for file in $(seq 1 34); do
for sample in $(seq 1 38); do
java -jar beagle.28Sep18.793.jar gt=/A_"$folder"/B_"$file"/F_"$file"_"sample".txt /A_"$folder"/B_"$file"/F_"$file"_"sample" out=/C/test_"file"_"$sample".out
done
done
done
此命令运行速度可能很慢。我知道有些文件没有退出,但是java
将跳过它并继续运行。对于这种情况,我想知道如何编写命令以正确读取文件。
答案 0 :(得分:2)
由于它的格式设置很差,因此不能确定您是否正确理解了您的问题,但是我认为您想在文件夹层次结构中的每个文本文件上运行Java程序。我认为您可以与 GNU Parallel 相对容易且快速地并行进行。
因此,这是使用find
生成文本文件列表的方法:
find . -name \*.txt -print
如果看起来正确,则可以再次运行相同的名称,但每个名称都以null终止,然后将其传递给 GNU Parallel ,如下所示:
find . -name \*.txt -print0 | parallel -0
现在,您要为每个文件运行一个Java程序,并为输出文件使用一个递增的数字,因此我们可以进行空运行,它仅打印将要执行的操作,而无需实际执行任何操作,例如:>
find . -name \*.txt -print0 | parallel -0 --dry-run java -jar beagle.28Sep18.793.jar gt={} out=/C/test_{#}.out
如果看起来正确,请删除--dry-run
并再次运行,它将与您拥有CPU核心的Java实例并行运行,并使它们全忙直到工作完成。