【问题标题】:Moving files to subfolders based on prefix in bash根据bash中的前缀将文件移动到子文件夹
【发布时间】:2021-05-23 16:04:39
【问题描述】:

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

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 中的这些关键字将这些文件移动到子文件夹中,但我不太确定如何。对此的任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: linux bash shell command-line


    【解决方案1】:

    我猜你想要这样的东西:

    $ find . -type f | awk -F_ '{system("mkdir -p "$5"/"$6";mv "$0" "$5"/"$6)}'
    

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

    【讨论】:

      【解决方案2】:

      使用带有 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,以便它创建目录并移动文件。

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 2020-07-17
        相关资源
        最近更新 更多