我有一个巨大的mp3文件列表,我想要整齐有效地处理其名称。
首先,我想删除文件名中的空格。我正在使用tr -d''。有没有可能失败的情况?
其次,许多文件名以数字或一堆数字开头。例如,01-filename.mp3或02_file.mp3等我尝试使用tr -d [:digit:]但是mp3中的3消失了,文件变成_file.mp如何解决这个问题?
沿着类似的方向,我有另一个问题。使用sed进行修改时,如何引用“其余字符串”?例如,我的第一个想法是像^ [0-9]这样的正则表达式来引用“以数字开头”,但后来我被卡住了。我怎么说“(a)从数字(b)数字开始重复多次(c)其余字符串” - >替换为(c)其余字符串?
答案 0 :(得分:2)
您是否考虑过Linux rename命令?
答案 1 :(得分:0)
像这样:(未经测试)
sed -e 's/^[0-9]\+\(.*\)$/\1/'
基本上,
(.*)
括起来(即使字符串的其余部分为空,这也会匹配,这在您的情况下会很糟糕)\1
答案 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 tutorials。 Perl regular expression tutorial特别好(大多数正则表达式引擎主要与Perl兼容)。
答案 3 :(得分:0)
首先,我想删除文件中的空格 名。我正在使用tr -d''。在那儿 任何可能失败的情况?
当然可以。如果有两个文件除了空格之外具有相同的名称,该怎么办? (一个人可能会无意中覆盖另一个,或者你可能会重命名失败)。此外,处理带空格的文件名可能是一个挑战;你必须记得正确引用它们。
在回答您的其他问题时,我会说,您可以考虑从文件中的ID3标记构建名称,而不是在任何意义上保持文件名完整,而不是修改现有名称。你可以试试'id3ren'