Кто-нибудь успешно использовал shopt -s extglob (расширенное глобирование) в bash с настройками SBATCH на HP C? - PullRequest
0 голосов
/ 29 апреля 2020

Подводя итог:

Я использую оболочку bash, версия: 4.2.46 (2) -релиз

Я хочу отправить сценарий пакетного задания в планировщик заданий, где: в сценарии я использую расширенное глобирование, которое включается с помощью shopt -s extglob в отдельной строке для расширенной команды глобирования, которую я пытаюсь использовать.

Я хочу выполнить эти команды:

echo !(wmparc.nii.gz)
#  for sid in $SubIdStr; do

#     cd $sid
#     rm -r rfMRI T2w
#     cd T1w
#     rm -r !(wmparc.nii.gz)
#     cd ..
#     cd MNINonLinear/
#     rm -r !(wmparc.nii.gz|T1w_restore_brain.nii.gz|Results)
#     cd ..
#     cd ..

#  done

Я пытался использовать shopt -s extglob перед этими командами с новой строкой между ними, например. :

shopt -s extglob

echo !(wmparc.nii.gz)

Это не работает, и при написании внешнего экглоба не отображается отображение включения или выключения расширенного сглаживания, которое выводится в мои файлы журнала.

Единственное место, где я обнаружил, что shopt -s extglob to work работает с самого начала, например:

#!/bin/bash
shopt -s extglob

Это проблема, однако, потому что мои настройки SBATCH не интерпретируются, например. :

#SBATCH --mail-type=END                         
#SBATCH --mail-user=
#SBATCH --partition=imgcomputeq
#SBATCH --qos=img
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --mem=5g
#SBATCH --time=50:00:00

Это описание sbatch из руководства:

sbatch отправляет пакетный скрипт в Slurm. Пакетный скрипт может быть передан sbatch через имя файла в командной строке, или, если имя файла не указано, sbatch будет считывать скрипт из стандартного ввода. Пакетный скрипт может содержать опции, начинающиеся с «#SBATCH» перед любыми исполняемыми командами в скрипте. sbatch прекратит обработку дальнейших директив #SBATCH, как только в сценарии будет достигнута первая строка без пробелов в комментариях.

Каталоги, в которых я пытаюсь удалить все, кроме файлов, содержащихся в расширенном глобусе. представляют собой набор каталогов и файлов, которые я хочу удалить.

Мне любопытно, сталкивался ли кто-нибудь с этой проблемой раньше / знает об обходном пути? Или можете предложить альтернативное решение?

1 Ответ

0 голосов
/ 30 апреля 2020

Обходной путь, который является более POSIX (совместимым) и, следовательно, спорным, лучше:

for sid in $storeIdStr; do

  rm -r $sid/rfMRI $sid/T2w
  find $sid/MNINonLinear/ -maxdepth 1 -mindepth 1 ! -name 'wmparc.nii.gz' ! -name 'T1w_restore_brain.nii.gz' ! -name 'Results' -exec rm -rf {} \;
  find $sid/T2w/ -maxdepth 1 -mindepth 1 ! -name 'T2w_acpc.nii.gz' -exec rm -rf {} \;
  find $sid/T1w/ -maxdepth 1 -mindepth 1 ! -name 'wmparc.nii.gz' -exec rm -rf {} \;

done

Все равно было бы интересно услышать чьи-либо ответы относительно того, почему shopt -s extglob должен быть помещен в начало скрипта или чей-либо опыт при использовании в сочетании с настройками SBATCH?

...