我有一个mp3
像这样命名的文件列表:
$artist/$album ($year)/$tracknum $title.mp3
这些轨道中的许多轨道都有不正确或丢失的标记,id3v2
由于文件名都是正确的,因此我正在通过使用和regex进行更正。这是我如何设置标题的示例:
for mp3 in *.mp3; do id3v2 -t "$(echo $mp3 | cut -d. -f1 | cut -d\ -f2-)" "$mp3"; done
(注意:引号是存在的,因为标题经常有空格,除非使用空格,否则bash会抱怨)
我的问题是:是否有更好的方法从这些文件中提取特定的子字符串?就标题而言,我不能不grep -o
进行匹配就使用,$tracknum
因为许多轨道的标题中都有数字和空格(这意味着我需要"([0-9a-zA-Z ]+)"
我的模式,该模式与之前的整个文件名匹配.mp3
)。
我几乎可以肯定,有更好的方法可以做到这一点。在那儿?
如果要提取标题(如果有用的话,请提取tracknum),则应该可以这样做:
read -r tracknum title <<<$(basename "$mp3" .mp3)
对于其他位,我将从分割文件名开始/
以隔离各部分。例如:
album_year=$(cut -d/ -f2 <<<"$mp3")
album=${album%\ (*)}
year=${album_year:-5:4}
最后一个取决于实际年份和四位数。如果不能保证,则可以使用更笨拙的表达式来做到这一点:
year=${album_year:$((${#album}+2)):$((${#album_year}-${#album}-3}
另外,如果您不知道album_year
零件的路径有多深,则可以使用以下命令提取倒数第二个分段(即文件的直接目录):
album_year=$(basename "$(dirname "$mp3")")
或者,您可以将整个路径拆分为一个数组:
IFS=/ read -ra segments <<<"$mp3"
album_year=${segments[-2]}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句