我有一个 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 程序。我认为您可以使用 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 实例,并使它们全部忙碌,直到作业完成完成了。
关于bash - 如何通过 bash/shell 读取组合列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505072/