使用 sed 移动文件名的一部分

使用 sed 移动文件名的一部分

我有一些音乐文件,命名为“曲目名称[艺术家]”。

我希望它们是“[艺术家] 曲目名称”,因此需要将方括号及其中的内容移动到文件的开头。

我刚刚发现 sed,但不知道如何使用它来做我想做的事情。

答案1

使用 sed

有很多方法可以做到这一点。如果你想在学习的同时做到这一点sed,那么请尝试:

$ filename='track name [artist].mp3'
$ newname=$(echo "$filename" | sed -E 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[\2] \1/')
$ echo "$newname"
[artist] track name.mp3

sed 替换命令的形式为,s/old/new/其中old是正则表达式。在本例中old由以下部分组成:

  1. (.*[^[:space:]])捕获曲目名称。由于此正则表达式被括号包围,因此曲目名称被保存在一个组中。部分.*匹配任何内容。匹配[^[:space:]]任何非空格。通过放在[^[:space:]]末尾,我们确保这会捕获曲目名称,但不捕获其后的空格。

  2. [[:space:]]*[[]匹配轨道名称后面的空格(如果有)以及[其后的 。由于[是 sed-active 字符,因此我们必须以某种方式对其进行转义。在这里,我们将其放在方括号中以进行转义,如下所示[[]

  3. (.*)[]]匹配文件名中最后一个字符的文本]。此处的括号使艺术家姓名被捕获为第二组。

new替换命令的部分是。[\2] \1这会将第二组\2(艺术家姓名)放在第一位,将第一组\1(曲目名称)放在第二位。

重命名文件的快捷方式

如果您的目标是重命名文件,我建议使用renameperl 包中的命令(有时称为prename):

$ ls *mp3
track name [artist].mp3
$ prename 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[$2] $1/' *.mp3
$ ls *mp3
[artist] track name.mp3

prename使用与 sed 非常相似的 perl 替换命令,但引用的捕获组不是和\1\2而是$1$2

注意:有些 Linux 安装了一个不同的rename实用程序,不相容并且不会像上面那样工作。

相关内容