Найти папки с определенным именем и запускать команды bash в каждом месте - PullRequest
1 голос
/ 08 июня 2019

У меня есть несколько экспортов Freesurfer с подкаталогами с именем "stats" в каждом.Я хочу запустить bash-скрипт, который ищет каждую папку «stats», а затем CD к ней, запускает предопределенный скрипт perl, который преобразует указанные файлы статистики, содержащиеся в каждой папке.Я хочу, чтобы они запускались в каждой папке рекурсивно.Папкам статистики присваивается номер МРТ, а затем дата.

Мне удалось получить скрипт для разделения MRIDATE, MIRIID и создания файлов из подпапки одного из экспортов.Я не могу заставить его работать в подкаталоге ниже.

#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

for D in */*/*/stats/; do
    echo $D
    if [ -d "${D}" ]; then
cd "${D}"

cwd=$(pwd)
D2=$(dirname "$cwd")
#Capture second folder in MRI name and date
MRINAME=$(basename "$D2")
DIRNAME2=$(basename "$D2")/$(basename "$cwd")
MRIID="$(cut -d'_' -f1 <<<"$MRINAME")"
echo "$MRIID"
MRIDATE="$(cut -d'_' -f2 <<<"$MRINAME")"
echo "$MRIDATE"
/Users/xxxxx/Documents/Bitbucket\ Repository/conversion-scripts/mri-read.pl -d $MRIDATE -s $MRIID lh.aparc.stats rh.aparc.stats wmparc.stats aseg.stats
fi
done

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

Вам необходимо вернуться в родительский каталог в конце вашего блока if.Вы можете сделать это с cd in / cd out или pushd / popd, или обернув внутреннюю часть блока (между then и fi) в подоболочку (parens).

Пример:

for dir in */
do
    # the if [ -d ... isn't necessary since the filespec in the for ends with a slash
    pushd "$dir" > /dev/null

    # other stuff

    popd > /dev/null
done
1 голос
/ 08 июня 2019

Я исправил код в первоначальном вопросе.Работает отлично.

#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

for D in */*/*/stats/; do
    echo $D
    if [ -d "${D}" ]; then
cd "${D}"

cwd=$(pwd)
D2=$(dirname "$cwd")
#Capture second folder in MRI name and date
MRINAME=$(basename "$D2")
DIRNAME2=$(basename "$D2")/$(basename "$cwd")
MRIID="$(cut -d'_' -f1 <<<"$MRINAME")"
echo "$MRIID"
MRIDATE="$(cut -d'_' -f2 <<<"$MRINAME")"
echo "$MRIDATE"
"$DIR/mri-read.pl" -d $MRIDATE -s $MRIID lh.aparc.stats rh.aparc.stats wmparc.stats aseg.stats
cd "${DIR}"
fi
done
...