在Bash中,根据名称将文件移动到目录
我有很多文件的名称具有以下格式: GroupName - SongName-id.mp3
其中id是11个字符长。我想将它们移动到目录中,例如文件GroupName - SongName-id.mp3
将被重命名为GroupName/SongName.mp3
我已经在网络上进行了一些研究(如this),但我不知道如何使用grep检索GroupName
和SongName
。 编辑:GroupName目录可以已经存在或不存在,它取决于。在Bash中,根据名称将文件移动到目录
我第一次使用下面的脚本尝试:
#!/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
考虑下面的复杂的解决方案:
#!/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
结果(返回组名和文件名通过;
分隔)成阵列mkdir -p "${parts[0]}"
- 创建目录与组名的名称如果不存在
感谢您的回答!但是,当GroupName中有空格时,它似乎被破坏了...有没有办法解决它?我正在考虑用'%'替换所有空格,但我不知道是否有更好的方法来做到这一点。 – Johan
你没有提到你的问题 – RomanPerekhrest
@Johan,看我的更新 – RomanPerekhrest
不'GroupName'已经存在? – RomanPerekhrest
请先做一点研究。 Stack Overflow中已经有很多*相关的问题。 – chepner
@chepner是的,我看到后,我仍然不知道如何检索GroupName和SongName。 – Johan