linux - 有没有人在 HPC 上通过 SBATCH 设置成功地在 bash 中使用 shopt -s extglob(扩展通配符)?
问题描述
总结一下:
我正在使用 bash shell,版本:4.2.46(2)-release
我想向 slurm 作业调度程序提交一个批处理作业脚本,在该脚本中,我使用扩展通配符,该扩展通配符在我尝试使用的扩展通配符命令的单独行上使用 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 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 设置结合使用时其他任何人的经验的答案吗?
推荐阅读
- jquery - 如何从长轮询中获取响应数据?
- python - 如何修复索引值 1 超出范围。无法通过 twitter 获取状态函数正确传递变量
- vuejs2 - Vue js - 在 DOM 中声明和使用变量
- python - 如何通过 ssh 将加密密码从一个脚本传递到另一个脚本?
- vbscript - 如何检查单元格中是否存在数组值?
- java - 正则表达式:在字符串中查找模式
- python - 如何修复处理 CIFAR-10 数据集、构建 CNN 的维度(值)错误?
- excel - 这个 excel 文件中的列表值是从哪里获取的?
- javascript - 如何对数组中的每个对象执行计算,然后输出该数组?
- leveldb - python和java之间的levelDB性能差异