Как запустить команду для папок, которые начинаются со слова SAM и находятся внутри другой папки? - PullRequest
0 голосов

Я пытаюсь запустить команду для всех папок, которые начинаются со слова SAM, которые находятся внутри другой папки с именем date (дата изменяется), а дата папки находится внутри другой папки с именем subject_01 (изменения темы) и папки subject_01 находится внутри основной папки с именем root.

Структура:

root/subject/date/SAM_folders

Это команда, которую я хочу запустить, и ее нужно выполнить с даты папки:

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 в каждой папке с именем date для всех субъектов.

Есть идеи, как я могу решить эту проблему? Спасибо

1 Ответ

1 голос
/ 27 мая 2020
for dir in /root/*/*/SAM_*; do
    (
        cd "$(dirname "$dir")"
        dtiConvPrep.sh "$(basename "$dir")"
    )
done

A for ((i = 0; i < len; ++i)) style l oop очень похож на C - / Java. В Bash более идиоматично c перебирать массивы напрямую. Или, в этом случае, перебирайте глобус напрямую.

Я заключил в скобки тело l oop, чтобы cd выполнялись в подоболочке и носили временный характер. В этом нет необходимости, поскольку вы cd идете по абсолютным путям, но это хорошая привычка. Мне нравится избегать cd в середине скриптов, так как это меняет глобальное состояние таким образом, чтобы легко испортить.

Вы можете найти все двойные кавычки немного раздражающими, но это хорошая привычка всегда заключайте в кавычки расширения переменных и $(...), если они содержат пробелы или другие специальные символы. В этом скрипте нам нужно, чтобы вложенные кавычки были на 100% безопасными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...