在Bash中,根据文件名将文件移动到目录

时间:2017-06-10 14:35:25

标签: linux bash

我有很多名称格式如下的文件: GroupName - SongName-id.mp3其中id为11个字符长。我想将它们移动到文件GroupName - SongName-id.mp3等目录中,将其重命名为GroupName/SongName.mp3 我已在网上完成了一些研究(如this),但我不知道如何使用grep检索GroupNameSongName。 编辑:GroupName目录可以存在与否,取决于它。

我首先尝试使用以下脚本:

#!/bin/bash
for filename in *.mp3;do
    group=$(echo $filename | grep -oE ".* - .*-.{11}\.mp3")
    # I don't know what regex should I place above

    # do all the other stuff here ...
done

1 个答案:

答案 0 :(得分:0)

考虑以下复杂的解决方案:

#!/bin/bash

find . -regextype sed -regex '[^-]* - [^-]*-.\{11\}\.mp3' -print0 | while read -r -d $'\0' file
do
    IFS=\; read -a parts  <<< $(sed -E 's:.+/(\S[^/-]+\S) - (\S+)-\S{11}(\.mp3):\1;\2\3:' <<< "$file")
    mkdir -p "${parts[0]}"
    mv "$file" "${parts[0]}/${parts[1]}"
done

<强> 详细

  • -regextype sed(在find命令中) - 设置正则表达式的类型

  • -regex(在find命令中) - 用于按正则表达式模式查找文件的选项

  • -print0$'\0' - 确保将文件名分隔为零(空)字符

  • read -a parts - 读取sed结果(返回 groupname filename ,由;分隔)到数组

  • mkdir -p "${parts[0]}" - 创建名称为 groupname 的目录(如果不存在)