根据 bash 中的前缀将文件移动到子文件夹

Moving files to subfolders based on prefix in bash

我目前有一长串文件,看起来有点像这样:

Gmc_W_GCtl_E_Erz_Aue_Dl_281_heart_xerton
Gmc_W_GCtl_E_Erz_Aue_Dl_254_toe_taixwon
Gmc_W_GCtl_E_Erz_Homersdorf_Dl_201_head_xaubadan
Gmc_W_GCtl_E_Erz_Homersdorf_Dl_262_bone_bainan
Gmc_W_GCtl_E_Thur_Peuschen_Dl_261_blood_blodan
Gmc_W_GCtl_E_Thur_Peuschen_Dl_281_heart_xerton

命名模式都遵循相同的顺序,我主要寻求根据“Aue”、“Homersdorf”、“Peuschen”等部分对文件进行分组(下面还有很多其他的列表),这些关键字的位置始终相同(例如,它们后面都跟有 Dl;它们都在第五个下划线之后……等等)。

所有文件都在同一个文件夹中,我试图根据 bash 中的这些关键字将这些文件移动到子文件夹中,但我不太确定如何操作。如有任何帮助,我们将不胜感激,谢谢!

我猜你想要这样的东西:

$ find . -type f | awk -F_ '{system("mkdir -p ""/"";mv "[=10=]" ""/")}'

这会将 Gmc_W_GCtl_E_Erz_Aue_Dl_281_heart_xerton 移动到 /Erz/Aue/Gmc_W_GCtl_E_Erz_Aue_Dl_281_heart_xerton

使用带有 for 循环的 bash shell。

#!/usr/bin/env bash
 
shopt -s nullglob

for file in Gmc*; do
  [[ -d $file ]] && continue
  IFS=_ read -ra dir <<< "$file"
  echo mkdir -pv "${dir[4]}/${dir[5]}" || exit
  echo mv -v "$file" "${dir[4]}/${dir[5]}" || exit
done

将脚本放在有问题的目录中,使其可执行并执行。

删除 echo's 以便它创建目录并移动文件。