对于多个子文件夹,根据文件名将文件移动到子文件夹中

对于多个子文件夹,根据文件名将文件移动到子文件夹中

我有 100 多个子文件夹 ( P_XXX),每个子文件夹包含三组文件 ( run1run2run3):

/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

启用的nullglobshell 选项可确保在*/swu_run${i}_*.nii不匹配任何文件(已移动或丢失)时不会进入内部循环。

参数扩展${f%/*}删除最短后缀模式,/*留下父目录的路径。

相关内容