我想为所有以SAM开头的文件夹运行一条命令,这些文件夹位于另一个名为date的文件夹内(日期变化),date文件夹位于另一个名为subject_01的文件夹内(主题变化),subject_01文件夹位于名为root的主文件夹内。
的结构。
root/subject/date/SAM_folders
这是我要运行的命令,需要从文件夹date开始执行。
dtiConvPrep.sh folder_name
例子:"我创建了一个脚本:
dtiConvPrep.sh SAM_03_14_25
我创建了一个脚本。
#!/bin/bash
array=(/root/*/*) #this vector contains all the folders (subject/date)
len=${#array[@]}
for (( q=0; q<$len; q++ ));
do
cd ${array[$q]} #To execute the command from the folder date for each subject
sleep 1
dtiConvPrep.sh SAM*
done
但它只运行1个SAM文件夹,在每个文件夹中,称为日期的所有科目。
任何想法,我可以解决这个问题吗?谅谅
for dir in /root/*/*/SAM_*; do
(
cd "$(dirname "$dir")"
dtiConvPrep.sh "$(basename "$dir")"
)
done
A for ((i = 0; i < len; ++i))
风格的循环是一个很像C-Java的事情。在Bash中,直接在数组上迭代更习惯。或者在本例中,直接在 glob 上迭代。
我在循环体周围加了括号,这样一来 cd
在子壳中运行,而且只是暂时的。在这里没有必要,因为你是在用 cd
ing到绝对的路径,但这是一个好习惯。我喜欢避免 cd
ing,因为它改变了全局状态,很容易造成混乱。
你可能会觉得所有的双引号有点碍眼,但这是一个好习惯,总是引用变量扩展和 $(...)
的扩展,以防它们包含空格或其他特殊字符。在这个脚本中,我们需要嵌套引号来保证100%的安全。