Bash脚本更改文件名

3

我有一份巨大的mp3文件列表,我想要整洁高效地处理它们的名称。

首先,我想要删除文件名中的空格。我使用 tr -d ' '。是否存在任何可能导致失败的情况?

其次,很多文件名以数字或一串数字开头。例如,01-filename.mp3或02_file.mp3等。我尝试使用 tr -d [:digit:] 但是 mp3 中的 3 会消失,文件变成 _file.mp。如何解决这个问题?

类似的问题还有一个。在使用 sed 进行修改时,如何引用“字符串的其余部分”?例如,我的第一个想法是使用正则表达式 ^[0-9] 来引用“以数字开头”,但是我卡住了。我该如何说“任何(a)以数字开头(b)数字重复多次(c)字符串的其余部分”->替换为(c)字符串的其余部分?

4个回答

1

你考虑过 Linux rename 命令吗?


损坏的链接... - Al Lelopath

0

类似这样:(未经测试)

sed -e 's/^[0-9]\+\(.*\)$/\1/'

基本上,

  1. 使用 + 重复一次或多次。
  2. 使用括号包含“其余的字符串”匹配 (.*)(即使字符串的其余部分为空也会匹配,这在您的情况下可能不好)
  3. 使用反向引用引用其余字符串 \1

echo 01 - file.mp3 | sed -e 's/^[0-9]+(.*)$/\1/' -> 没有发生任何事情。我删除了上述内容中的“+”,并且第一个0被删除了。我猜想“+”应该表示重复前面的序列?但它没有按预期工作! - Hari Sundararajan
尝试使用代替+。+通常表示正则表达式中最后一个标记的1个或多个,而通常表示0个或多个最后一个标记。编辑:显然在sed中必须转义+:http://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html - Kevin Stricker
1
@Hari Sundararajan:在mootinator的命令中,在“-e”之前添加以下内容,以便同时去除空格(并消除对“tr”的需求):-e 's/ //g',从而得到完整的命令为:sed -e 's/ //g' -e 's/^[0-9]\+\(.*\)$/\1/' - Dennis Williamson

0

我不常使用tr,无法对tr -d ' '发表评论,但是您的其余问题可以通过正确的正则表达式解决。事实上,如果您正在使用sed,您可以添加一个去除空格的正则表达式,从而消除对tr的需求:

sed -r -e 's/ +//g' -e 's/^[0-9]*[_-]*(.+\.mp3)$/\1/I'

-r 选项告诉 sed 打开扩展模式,以便可以使用“新”功能,例如 + 修改符。每个跟随 -e 的正则表达式将按照指定的顺序应用于每行。

第一个正则表达式将所有匹配项 (g) 中的一个或多个空格替换为无,而不仅仅是第一个。

第二个正则表达式匹配任何以数字开头的行(方括号表示要匹配的字符集,而- 表示集合中的范围)。* 表示“匹配前面的字符零次或多次”。圆括号用于“分组”匹配的一部分以供后面使用。.+ 匹配所有剩余的字符,而 \.mp3 则匹配文件名的扩展名(由于点号通常表示“任意字符”,因此我们需要用反斜杠转义,以便得到字面意义上的点号)。替换字符串中的 \1 表示第一个(在本例中唯一的)组。最后, I 修改符表示匹配将不区分大小写。

如果你想学习更多,网上有很多正则表达式教程Perl正则表达式教程特别好(大多数正则表达式引擎都与Perl兼容)。


太棒了!完美。现在,你能给我指一些好的网络正则表达式学习参考资料吗?我可以理解上面的大部分内容。有三个问题 - (a) [] 和 () 包含的区别是什么?(b) 在结尾处 /I 是什么意思?(c) * 表示多个条目吗?非常感谢你! - Hari Sundararajan

0
首先,我想要移除文件名中的空格。我使用的是 tr -d ' ' 命令。但是有没有可能出现失败的情况呢?
当然有可能。如果你有两个文件除了空格之外的名称完全相同,那么一个文件可能会意外地覆盖另一个文件,或者重命名操作可能会失败。此外,处理带有空格的文件名可能会很棘手;你必须记得正确地引用它们。
针对你提到的其他问题,我建议你不要修改现有的文件名,而是考虑从文件内部的 ID3 标签构建文件名,而不保留任何与文件名相关的信息。你可以尝试使用 'id3ren' 命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接