Сценарий Bash для Выполнения команды в X файлов за один раз

Я в настоящее время выполняю freesurfer, и я пытаюсь выполнить несколько recon-all команды. Машина только может обработать 10 сборок сразу. Я хочу создать сценарий удара, который работает recon-all команда на каждом файле в каталоге, но только 10 файлах за один раз.

Мой текущий скрипт запущен для всех файлов один за другим:

for f in *.nii; do
    if [ -f ${f} ]; then
        echo $f
    recon-all -i $f -s $f"DIR" -all > $f"_log3.txt" &
    fi
done

Я в основном должен установить его так 10-е выполнения сборки без и команда, таким образом, это должно будет ожидать, до, который завершен, прежде чем следующие 10 запускаются.

Какие-либо предложения?

ОБНОВЛЕНИЕ:

Вот завершенный код после решения:

find -type f -name '*.nii' -print0 |xargs -n10 -0 sh -c '
 echo "Running: ${0#./}"
 recon-all -i "$0" -s "$0DIR" -all > "$0_log.txt" &
 echo "Running: ${1#./}"
 recon-all -i "$1" -s "$1DIR" -all > "$1_log.txt" &
 echo "Running: ${2#./}"
 recon-all -i "$2" -s "$2DIR" -all > "$2_log.txt" &
 echo "Running: ${3#./}"
 recon-all -i "$3" -s "$3DIR" -all > "$3_log.txt" &
 echo "Running: ${4#./}"
 recon-all -i "$4" -s "$4DIR" -all > "$4_log.txt" &
 echo "Running: ${5#./}"
 recon-all -i "$5" -s "$5DIR" -all > "$5_log.txt" &
 echo "Running: ${6#./}"
 recon-all -i "$6" -s "$6DIR" -all > "$6_log.txt" &
 echo "Running: ${7#./}"
 recon-all -i "$7" -s "$7DIR" -all > "$7_log.txt" &
 echo "Running: ${8#./}"
 recon-all -i "$8" -s "$8DIR" -all > "$8_log.txt" &
 echo "Running: ${9#./}"
 recon-all -i "$9" -s "$9DIR" -all > "$9_log.txt"
 echo "Continuing to next batch"'
echo "Batch Completed!!!!!"
1
задан 24 August 2018 в 01:17

1 ответ

Ваш сценарий не выполняет все Ваши файлы сразу, но один за другим. И Вы выполняете передовод "против" команды - все в фоне, не ожидая к его ответу, таким образом, в следующем запуске он выбирает следующий файл для выполнения и все еще в фоне.

Использовать find с xargs и это будет работать за следующим файлом после предыдущего, законченного один за другим.

find -type f -name '*.nil' -print0 |xargs -n1 -0 sh -c 'recon-all -i "$1" -s "$1DIR" -all > "$1_log3.txt"' sh

для выполнения в 10 пакетах сделать

find -type f -name '*.nil' -print0 |xargs -n10 -0 sh -c '
     recon-all -i "$1" -i "$2" -i "$3" -i "$4" -i "$5" -i "$6" -i "$7" -i "$8" -i "$9" -i "$10" -s "$1DIR" -all > "$1_log3.txt"' sh

обратите внимание что -sпредмет берет от первого имени файла выше.

1
ответ дан 7 December 2019 в 15:14

Другие вопросы по тегам:

Похожие вопросы: