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

Linux 在Bash中,根据文件名将文件移动到目录中,linux,bash,Linux,Bash,我有很多文件,其名称的格式如下: GroupName-SongName-id.mp3其中id为11个字符长。我想将它们移动到目录中,例如文件GroupName-SongName-id.mp3将被重命名为GroupName/SongName.mp3 我在网上做了一些研究(比如),但我不知道如何使用grep检索GroupName和SongName。 编辑:GroupName目录可能已经存在或不存在,这取决于 我首先尝试使用以下脚本: #/bin/bash 文件名为*.mp3;做 组=$(echo$f

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

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

#/bin/bash
文件名为*.mp3;做
组=$(echo$filename | grep-oE.*-.*-.{11}\.mp3)
#我不知道我应该在上面放什么正则表达式
#在这里做所有其他的事情。。。
完成

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

#!/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
#/bin/bash
找到-regextype sed-regex'[^-]*-[^-]*-.\{11\}\.mp3'-print0 |而read-r-d$'\0'文件
做

IFS=\;阅读-是否已存在
GroupName
部分?请先做一些研究。堆栈溢出上已经有很多相关问题。@chepner是的,我看到了,但看了之后,我仍然不知道如何检索GroupName和SongName。在问题中包括您尝试过的内容;不要只是链接到另一个问题。谢谢你的回答!然而,当GroupName中有空格时,它似乎被破坏了。。。有办法解决吗?我想用
%
替换所有空格,但我不知道是否有更好的方法。你在问题中没有提到这一点