查找具有特定名称的文件夹,并在每个位置上运行bash命令
我有多个Freesurfer导出,每个导出中都有名为“stats”的子目录。我想运行一个bash脚本,搜索每个“stats”文件夹,然后将其放入其中,运行一个预定义的perl脚本,转换每个文件夹中包含的指定stats文件。我希望它们在每个文件夹上递归运行。统计文件夹的名称是MRI编号,然后是日期 我能够从其中一个导出的子文件夹中获取脚本来分离MRIDATE、MIRIID和创建文件。我无法让它在下面的子目录中工作查找具有特定名称的文件夹,并在每个位置上运行bash命令,bash,command-line,Bash,Command Line,我有多个Freesurfer导出,每个导出中都有名为“stats”的子目录。我想运行一个bash脚本,搜索每个“stats”文件夹,然后将其放入其中,运行一个预定义的perl脚本,转换每个文件夹中包含的指定stats文件。我希望它们在每个文件夹上递归运行。统计文件夹的名称是MRI编号,然后是日期 我能够从其中一个导出的子文件夹中获取脚本来分离MRIDATE、MIRIID和创建文件。我无法让它在下面的子目录中工作 #!/bin/bash DIR="$( cd "$( dirname "${BASH
#!/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)中。如果这解决了您的整个问题,请告诉我,我会将此注释的内容作为答案发布。为什么我没有看到?这非常有效。不要将所有大写字母用于非导出变量。请参阅