我正在尝试编写一个脚本来自动将曲目和标题信息添加到 mp3 文件的 id3 标签中。
此时,我已经 sed 从文件名中获取信息并将其格式化以适合 id3v2 命令,但在点击多字标题时,我收到错误Couldn't stat file '<second word of title>'
。如果我只是回显正在运行的 id3v2 命令,我会看到以下格式的命令:
id3v2 -t Title\ Of\ Track -T 1 1_-_Title_Of_Track.mp3
将该文本复制/粘贴到终端中可以正确执行标记,但当然缺乏预期的脚本自动化。因此,旨在自动化该过程的脚本如下所示:
#!/bin/bash
for track in *.mp3 ; do
id3v2 $(echo ${track} | sed -e 's/^\([1-9][0-9]*\)_-_\(.*\).mp3/-t \2 -T \1/' -e 's/_/\\ /g') ${track}
done
关于为什么标题在手动输入时被视为单个参数而不是在脚本编写时被视为单个参数的任何见解?
答案1
根据 Valentin B 和 mueh 的评论,我放弃了sed
脚本中的解析,而是使用 bash 的字符串操作。虽然sed
有利于解析多个数据并在单个命令中对其进行排序,但使用结果的命令扩展会将输出拆分为由空格分隔的“单词”,即使空格前面有反斜杠或用引号括起来。
id3v2
因此,它不是尝试使用 一次传递来构造所有参数sed
,而是使用 bash 的字符串操作分别解析出曲目编号和标题。最终结果:
for track in *.mp3 ; do
track_num=${track%_-_*}
title=${track#*_} ; title=${title%.mp3} ; title=${title//_/ }
id3v2 -t "${title}" -T ${track_num} ${track}
done
感谢 mueh 准确地解释了为什么我在问题中的方法不起作用,并感谢 Valentin B 介绍了 bash 的字符串操作。