2017-06-10 70 views
-2

我有很多文件的名称具有以下格式: GroupName - SongName-id.mp3其中id是11个字符长。我想将它们移动到目录中,例如文件GroupName - SongName-id.mp3将被重命名为GroupName/SongName.mp3 我已经在网络上进行了一些研究(如this),但我不知道如何使用grep检索GroupNameSongName。 编辑: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 
+0

不'GroupName'已经存在? – RomanPerekhrest

+0

请先做一点研究。 Stack Overflow中已经有很多*相关的问题。 – chepner

+0

@chepner是的,我看到后,我仍然不知道如何检索GroupName和SongName。 – Johan

回答

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结果(返回组名文件名通过;分隔)成阵列

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

+0

感谢您的回答!但是,当GroupName中有空格时,它似乎被破坏了...有没有办法解决它?我正在考虑用'%'替换所有空格,但我不知道是否有更好的方法来做到这一点。 – Johan

+0

你没有提到你的问题 – RomanPerekhrest

+0

@Johan,看我的更新 – RomanPerekhrest

相关问题