用于更改文件名的Bash脚本

时间:2010-11-07 21:22:23

标签: bash scripting text-processing

我有一个巨大的mp3文件列表,我想要整齐有效地处理其名称。

首先,我想删除文件名中的空格。我正在使用tr -d''。有没有可能失败的情况?

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

沿着类似的方向,我有另一个问题。使用sed进行修改时,如何引用“其余字符串”?例如,我的第一个想法是像^ [0-9]这样的正则表达式来引用“以数字开头”,但后来我被卡住了。我怎么说“(a)从数字(b)数字开始重复多次(c)其余字符串” - >替换为(c)其余字符串?

4 个答案:

答案 0 :(得分:2)

您是否考虑过Linux rename命令?

答案 1 :(得分:0)

像这样:(未经测试)

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

基本上,

  1. 重复使用+一次或多次。
  2. 将“其余字符串”匹配(.*)括起来(即使字符串的其余部分为空,这也会匹配,这在您的情况下会很糟糕)
  3. 使用反向引用来引用字符串\1
  4. 的其余部分

答案 2 :(得分: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修饰符表示匹配不区分大小写。

如果您想了解更多内容,网上有很多或regex tutorialsPerl regular expression tutorial特别好(大多数正则表达式引擎主要与Perl兼容)。

答案 3 :(得分:0)

  

首先,我想删除文件中的空格   名。我正在使用tr -d''。在那儿   任何可能失败的情况?

当然可以。如果有两个文件除了空格之外具有相同的名称,该怎么办? (一个人可能会无意中覆盖另一个,或者你可能会重命名失败)。此外,处理带空格的文件名可能是一个挑战;你必须记得正确引用它们。

在回答您的其他问题时,我会说,您可以考虑从文件中的ID3标记构建名称,而不是在任何意义上保持文件名完整,而不是修改现有名称。你可以试试'id3ren'