如何为以 "SAM "开头的文件夹运行命令,并在另一个文件夹内?

问题描述 投票:-1回答:1

我想为所有以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文件夹,在每个文件夹中,称为日期的所有科目。

任何想法,我可以解决这个问题吗?谅谅

bash shell
1个回答
1
投票
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在子壳中运行,而且只是暂时的。在这里没有必要,因为你是在用 cding到绝对的路径,但这是一个好习惯。我喜欢避免 cding,因为它改变了全局状态,很容易造成混乱。

你可能会觉得所有的双引号有点碍眼,但这是一个好习惯,总是引用变量扩展和 $(...) 的扩展,以防它们包含空格或其他特殊字符。在这个脚本中,我们需要嵌套引号来保证100%的安全。

© www.soinside.com 2019 - 2024. All rights reserved.