如何通过 bash/shell 读取组合列表?



我有一个A_1文件夹,一个A_2文件夹,一个A_3文件夹.....直到A_561文件夹。

每个文件夹都有一个子目录,其中包含B_1B_2B_3...和一个B_34文件夹。

B_1文件夹中,有名为F_1_1.txtF_1_2.txt...F_1_38.txtF_2_1.txt,F_2_1.txt...F_2_38.txt

B_2文件夹中,有名为F_1_1.txtF_1_2.txt...F_1_38.txtF_2_1.txt,F_2_1.txt...F_2_38.txt

B_2文件夹中,有名为F_1_1.txtF_1_2.txt...F_1_38.txtF_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会跳过它并运行下一个。我想知道在这种情况下,如何编写命令以正确读取文件。

我不确定是否正确理解了您的问题,因为它的格式很差,但我认为您想在文件夹层次结构中的每个文本文件上运行 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实例,并使它们保持忙碌,直到作业完成。

最新更新