2017-06-10 101 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

相關問題