我有很多名称格式如下的文件:
GroupName - SongName-id.mp3
其中id为11个字符长。我想将它们移动到文件GroupName - SongName-id.mp3
等目录中,将其重命名为GroupName/SongName.mp3
我已在网上完成了一些研究(如this),但我不知道如何使用grep检索GroupName
和SongName
。
编辑: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
答案 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 的目录(如果不存在)