我使用命令行实用程序youtube-dl
从 YouTube 下载视频,并用 制作 mp3 avconv
。我在 Ubuntu 14.04 下执行此操作,对此非常满意。
该实用程序下载文件并使用以下名称方案保存它们:
TITLE(artist-track)-ID.mp3
因此实际的文件名如下所示:
EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
文件夹中的其他一些文件名如下:
EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
Stromae - Papaoutai-oiKj0Z_Xnjc.mp3
一开始,这不是什么问题。当我在 Rhytmbox 中听音乐时,它并没有困扰我。但是当移动到手机或其他设备时,看到这么长的名称会让人感到困惑,而且有些播放器(例如三星播放器)会将名称的最后一部分(第二个破折号后的 ID)视为专辑或其他内容。
我想创建一个 bash 脚本,删除所有文件名称中第二个破折号后面的内容,因此它会使它们如下所示:
从:Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
到:Martin Garrix - Animals (Official Video).mp3
是否也可以指示youtube-dl
从现在开始排除该 ID?
我目前正在使用以下命令下载:
youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 URL
答案1
我会使用基于 Perl 的命令 - 例如,要删除以后缀开头rename
的最短单词字符序列,您可以尝试-
.mp3
rename -nv -- 's/-\w+?[.]mp3$/.mp3/' *.mp3
该n
选项以“空运行”模式运行命令 - 如果匹配正确,则删除该n
选项并再次运行。
答案2
您不需要的部分是视频 ID。您可以使用 youtube-dl 的输出模板功能:
--output "%(title)s"
这将仅使用标题并省略 ID。运行时youtube-dl
不带参数可查看其他选项。
您可以修复现有的下载:
for i in *; do mv "$i" `basename "$i" .mp3 | cut -f -2 -d "-"`.mp3; done
(这相当于Jakke的回答)。
答案3
sed 可以在一行中完成此操作,尽管方式相当复杂。
ls | sed 's/\(.*\)\(-.*\)/mv \"&\" \"\1.mp3\"/' | bash
这首先列出当前目录中的文件(假设您要重命名的所有文件都在当前目录中),然后使用 sed 的 s/regex/replacement 命令生成合理的 mv 命令,然后将其传送到 bash 并由 bash 执行。这假设您的所有文件都是“AC.mp3”或“A - BC.mp3”格式。它的工作原理如下:
sed 命令的正则表达式部分是
\(.*\)\(-.*\)
这会将名称“分组”为两组(以转义括号分隔):一组匹配“.*”(任意数量的任意字符),另一组匹配“-.*”(一个破折号后跟任意数量的任意字符)。请注意,这会匹配整个文件名(分为两组)。还请注意,由于使用了“贪婪”正则表达式,因此第一组将匹配“AC.mp3”中的“A”和“A - B”,而不仅仅是“A - BC.mp3”中的“A”,正如所希望的那样。
sed 命令的替换部分是
mv \"&\" \"\1.mp3\"/
请注意,& 字符指示 sed 插入与正则表达式匹配的整个模式(在本例中为整个文件名),而 \1 指示 sed 插入与第一个分组“.*”匹配的文件名部分。这两个字符与前面的 mv 和后面的 .mp3 组合,并使用转义引号生成合理的重命名命令。例如,对于“A - BC.mp3”,完整的 sed 命令将生成:
mv "A - B-C.mp3" "A - B.mp3"
最后,所有这些都通过管道传输到 bash,它会顺利地执行 mv(重命名)命令。
答案4
仅使用 shell 的解决方案:
filename=foo-bar-baz
while read -rd-; do
newname="${newname:+$newname-}$REPLY"
done <<< "$filename"
mv "$filename" "$newname"
这是可行的,因为文件名不以破折号结尾,所以最后一个标记被忽略。