查找具有特定名称的文件夹,并在每个位置上运行bash命令

查找具有特定名称的文件夹,并在每个位置上运行bash命令,bash,command-line,Bash,Command Line,我有多个Freesurfer导出,每个导出中都有名为“stats”的子目录。我想运行一个bash脚本,搜索每个“stats”文件夹,然后将其放入其中,运行一个预定义的perl脚本,转换每个文件夹中包含的指定stats文件。我希望它们在每个文件夹上递归运行。统计文件夹的名称是MRI编号,然后是日期 我能够从其中一个导出的子文件夹中获取脚本来分离MRIDATE、MIRIID和创建文件。我无法让它在下面的子目录中工作 #!/bin/bash DIR="$( cd "$( dirname "${BASH

我有多个Freesurfer导出,每个导出中都有名为“stats”的子目录。我想运行一个bash脚本,搜索每个“stats”文件夹,然后将其放入其中,运行一个预定义的perl脚本,转换每个文件夹中包含的指定stats文件。我希望它们在每个文件夹上递归运行。统计文件夹的名称是MRI编号,然后是日期

我能够从其中一个导出的子文件夹中获取脚本来分离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
#/bin/bash
DIR=“$(cd“$(dirname“${BASH_SOURCE[0]}”)”>/dev/null 2>&1&&pwd)
适用于*/*/*/stats/中的D;做
echo$D
如果[-d“${d}”];然后
cd“${D}”
cwd=$(pwd)
D2=$(目录名“$cwd”)
#捕获MRI名称和日期中的第二个文件夹
MRINAME=$(basename“$D2”)
DIRNAME2=$(basename“$D2”)/$(basename“$cwd”)

MRIID=“$(cut-d'-f1我更正了第一个问题中的代码。它工作得非常好

#!/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
!/bin/bash
DIR=“$(cd“$(dirname“${BASH_SOURCE[0]}”)”>/dev/null 2>&1&&pwd)
对于*/*/*/stats/;do中的D
echo$D
如果[-d“${d}”];则
cd“${D}”
cwd=$(pwd)
D2=$(目录名“$cwd”)
#捕获MRI名称和日期中的第二个文件夹
MRINAME=$(basename“$D2”)
DIRNAME2=$(basename“$D2”)/$(basename“$cwd”)

MRIID=“$(cut-d'-f1您需要将光盘放回if块末尾的父目录。您可以使用
cd
in/
cd
out或
pushd
/
popd
或将块的内部(在
then
fi
之间)包装到子shell(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

IFS=\read-r MRIID MRIDATE我做了一些修改。我可以在找到的第一个文件夹上运行命令,但不能在第二个文件夹上运行,或者在第二个文件夹上运行更多。您需要
cd
返回
if
块末尾的父目录。您可以使用
cd
in/
cd
out或
pushdir
/
popdir
或将块的内部(在
然后
fi
之间)包装在子shell(parens)中。如果这解决了您的整个问题,请告诉我,我会将此注释的内容作为答案发布。为什么我没有看到?这非常有效。不要将所有大写字母用于非导出变量。请参阅