Как прочитать список комбинаций по bash / shell? - PullRequest
2 голосов
/ 08 июня 2019

У меня есть папка 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 для чтения файлов по

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 пропустит его и запустится дальше. Я хотел бы знать для этого случая, как я могу написать команду для правильного чтения файлов.

1 Ответ

2 голосов
/ 08 июня 2019

Не могу быть уверен, что правильно понял ваш вопрос, потому что он плохо отформатирован, но я думаю, что вы хотите запустить программу Java для каждого текстового файла в иерархии папок. Я думаю, что вы можете сделать это относительно легко и быстро параллельно с GNU Parallel .

Итак, вот как сгенерировать список текстовых файлов с помощью find:

find . -name \*.txt -print

Если это выглядит правильно, вы можете запустить то же самое снова, но завершить каждое имя нулем и передать его в 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 и запустите его снова, и он будет запускать столько экземпляров Java параллельно, сколько у вас ядер ЦП, и будет держать их все занятыми до тех пор, пока задания не будут выполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...