总结一下。
我使用的是bash shell,版本为:4.2.46(2)-release。4.2.46(2)-release。
我想提交一个批处理作业脚本到 slurm 作业调度器,在脚本中我使用了扩展的 globbing,在我试图使用的扩展 globbing 命令之外的另一行使用 shopt -s extglob 打开了扩展 globbing。
我想运行这些命令。
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 extglob 后,也没有显示扩展的 globbing 是开启还是关闭,并输出到我的日志文件中。
我发现 shopt -s extglob 唯一有效的地方是在开始的时候,比如说:"你可以用这个方法。
#!/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指令。
我试图删除所有的目录,但在扩展的glob中包含的文件除外,我想删除的目录和文件是混合的。
我很好奇是否有人遇到过这个问题?或者可以提供一个替代的解决方案?
工作方法是更多的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设置结合使用?