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

如何通过bash/shell读取组合列表?,bash,shell,loops,combinations,Bash,Shell,Loops,Combinations,我有一个A_1文件夹、一个A_2文件夹、一个A_3文件夹……直到A_561文件夹 每个文件夹都有一个子目录,其中包含一个B_1、一个B_2、一个B_3。。。还有一个B_34文件夹 在B_1文件夹中,有名为F_1_1.txt、F_1_2.txt的文件。。。F_1_38.txt。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。F_2_1.txt,F_2_1.txt。。。F_2_38.tx

我有一个A_1文件夹、一个A_2文件夹、一个A_3文件夹……直到A_561文件夹

每个文件夹都有一个子目录,其中包含一个B_1、一个B_2、一个B_3。。。还有一个B_34文件夹

在B_1文件夹中,有名为F_1_1.txt、F_1_2.txt的文件。。。F_1_38.txt。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。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。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
将跳过它并在下一步运行。我想知道在这种情况下,如何编写命令来正确读取文件。

我不能确定是否正确理解了您的问题,因为它的格式太差了,但我认为您希望在文件夹层次结构中的每个文本文件上运行Java程序。我认为你可以相对容易和快速地与gnupallel并行

下面是如何使用
find
生成文本文件列表:

find . -name \*.txt -print
如果这看起来是正确的,您可以再次运行相同的名称,但可以null终止每个名称,并将其传递到GNU Parallel,如下所示:

find . -name \*.txt -print0 | parallel -0
find . -name \*.txt -print0 | parallel -0 --dry-run java -jar beagle.28Sep18.793.jar gt={} out=/C/test_{#}.out
现在,您需要为每个文件运行一个Java程序,并对输出文件使用递增的数字,这样我们就可以进行一次干运行,只打印它将要执行的操作,而不实际执行任何操作,如:

find . -name \*.txt -print0 | parallel -0
find . -name \*.txt -print0 | parallel -0 --dry-run java -jar beagle.28Sep18.793.jar gt={} out=/C/test_{#}.out

如果这看起来正确,请删除
--dry run
并再次运行它,它将并行运行与CPU内核数量相同的Java实例,并使它们一直处于忙碌状态,直到任务完成。

缩进代码。您的意思是“退出”还是“存在”?为什么不使用globbing(通配符)或
find
而不是构建文件名?至少你不会得到任何错误的点击。嵌套循环运行缓慢,甚至没有调用程序-724812迭代!你也可以考虑用java编写这个。考虑一下:对于每一次迭代(有多少次?),您都会将java运行时加载到机器中——这需要花费很多时间,我并不奇怪它的速度很慢。724812 java运行时的子进程和加载。如何处理循环中的
sample
for sample in?请指定
java-jar beagle.28Sep18.793.jar gt=/A_1/B_1/F_1.txt/A_1/B_1/F_2_1 out=/C/test_1.out
是否为单个
java
命令,如果不是,它是一个
java
命令,后跟两个shell脚本赋值,还是其他什么。