2010-11-07 268 views
2

我有一个巨大的MP3文件列表,我想要整洁有效地处理它的名称。Bash脚本来更改文件名

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

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

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

回答

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 tutorials在线如果你想了解更多。Perl regular expression tutorial特别好(大多数正则表达式引擎大部分是Perl兼容的)。

+0

太棒了!完美。现在,您能指导我学习网上RegExes的一些很好的参考吗?我可以理解大部分(a)封闭在[]和()中有什么区别?(b)最后我做了什么?(c)*是否意味着多个条目?并且非常感谢你! – 2010-11-07 21:37:27

2

您是否考虑过Linux rename命令?

0

像这样:(另)

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

基本上,

  1. 用+重复一次或多次。
  2. 支架匹配(.*)“字符串的休息”(即使该字符串的其余部分为空,这将匹配,这将是坏你的情况)
  3. 使用反向引用来引用字符串的其余部分\1
+0

echo 01 - file.mp3 | sed -e's/^ [0-9] + \(。* \)$/\ 1 /' - >没有任何事情发生。我删除了上面的'+',第一个0被删除。我猜测+应该意味着重复的前一个序列?它没有按预期工作! – 2010-11-07 21:34:32

+0

尝试*而不是+。 +通常表示正则表达式中的最后一个令牌的一个或多个,*通常表示最后一个令牌的最后一个令牌为0或更多。编辑:显然你必须在sed中逃避+:http://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html – 2010-11-07 21:38:17

+1

@Hari Sundararajan:在mootinator的命令中的'-e'前加上也可以去掉空格(并且不需要'tr':'-e's/// g',导致完整的命令是:'sed -e's/// g'-e's/^ [0-9] \ + \(。* \)$/\ 1 /''。 – 2010-11-07 21:55:51

0

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

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

为了回应您的其他问题,我会说,而不是修改现有名称,您可能会考虑从文件内的ID3标签构建名称,而不是在任何意义上保持文件名完整无缺。你可以试试'id3ren'