我有 100 多个子文件夹 ( P_XXX
),每个子文件夹包含三组文件 ( run1
、run2
和run3
):
/Analysis
/P_076
/run1
/run2
/run3
swu_run1_P_076_vol_001.nii
swu_run1_P_076_vol_002.nii
swu_run2_P_076_vol_001.nii
swu_run2_P_076_vol_002.nii
swu_run3_P_076_vol_001.nii
swu_run3_P_076_vol_002.nii
/P_102
/run1
/run2
/run3
swu_run1_P_102_vol_001.nii
swu_run1_P_102_vol_002.nii
swu_run2_P_102_vol_001.nii
swu_run2_P_102_vol_002.nii
swu_run3_P_102_vol_001.nii
swu_run3_P_102_vol_002.nii
我想将三组文件移动到现有子文件夹内其自己的子文件夹(run1、run2 和 run3):
/Analysis
/P_076
/run1
swu_run1_P_076_vol_001.nii
swu_run1_P_076_vol_002.nii
/run2
swu_run2_P_076_vol_001.nii
swu_run2_P_076_vol_002.nii
/run3
swu_run3_P_076_vol_001.nii
swu_run3_P_076_vol_002.nii
/P_102
/run1
swu_run1_P_102_vol_001.nii
swu_run1_P_102_vol_002.nii
/run2
swu_run2_P_102_vol_001.nii
swu_run2_P_102_vol_002.nii
/run3
swu_run3_P_102_vol_001.nii
swu_run3_P_102_vol_002.nii
当我在子文件夹 (P_XXX) 中运行脚本时,下面的代码可以解决问题:
for f in swu_run?_*.nii; do
num=${f:7:1}
mv "$f" run"$num"/
done'
但我正在努力寻找适当的for
循环以使其从父目录(分析)工作,而不是在每个子文件夹中手动运行它。我尝试了以下方法:
find . -type f -name '*.nii' -exec bash -c '
for f in swu_run?_*.nii; do
num=${f:7:1}
mv "$f" run"$num"/
done' bash {} +
这会返回错误消息cannot stat 'swu_run?_*.nii': No such file or directory.
如何在 Analysis 文件夹级别运行代码,以便将每个 P_XXX 子文件夹一次性重新组织到另外三个子文件夹(run1、run2 和 run3)及其匹配文件中?
答案1
您可以使用两个循环bash
:
cd /path/to/Analysis
shopt -s nullglob
for i in {1..3}; do
for f in */swu_run${i}_*.nii; do
mv "$f" "${f%/*}/run${i}/"
done
done
启用的nullglob
shell 选项可确保在*/swu_run${i}_*.nii
不匹配任何文件(已移动或丢失)时不会进入内部循环。
参数扩展${f%/*}
删除最短后缀模式,/*
留下父目录的路径。