删除文件夹中所有文件的文件名的特定部分(第二个破折号后面的内容)

删除文件夹中所有文件的文件名的特定部分(第二个破折号后面的内容)

我使用命令行实用程序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"

这是可行的,因为文件名不以破折号结尾,所以最后一个标记被忽略。

相关内容