更改文件名的Bash脚本

更改文件名的Bash脚本,bash,scripting,text-processing,Bash,Scripting,Text Processing,我有一个巨大的mp3文件列表,我想整齐高效地处理这些文件的名称 首先,我想删除文件名中的空格。我正在使用tr-d“”。是否存在可能失败的情况 第二,许多文件名以一个数字或一组数字开头。例如,01-filename.mp3或02_file.mp3等。我尝试使用tr-d[:digit:],但是mp3中的3消失了,文件变成了_file.mp。我如何解决这个问题 同样,我还有一个问题。使用sed进行修改时,如何引用“字符串的其余部分”?例如,我的第一个想法是使用^[0-9]这样的正则表达式来表示“以数字

我有一个巨大的mp3文件列表,我想整齐高效地处理这些文件的名称

首先,我想删除文件名中的空格。我正在使用tr-d“”。是否存在可能失败的情况

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


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

您考虑过Linux命令吗?

类似这样的东西:(未经测试)

基本上

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

  • 我使用
    tr
    的次数不足以对
    tr-d'
    进行评论,但是您的其余问题可以使用正确的正则表达式解决。事实上,如果您使用的是
    sed
    ,您可以添加一个空格来删除regex,这样就不需要
    tr

    sed -r -e 's/ +//g' -e 's/^[0-9]*[_-]*(.+\.mp3)$/\1/I'
    
    -r
    选项告诉
    sed
    打开其扩展模式,以便可以使用像
    +
    修饰符这样的“新”功能。
    -e
    后面的每个正则表达式将按照指定的顺序应用于每一行

    第一个空格将一个或多个(
    +
    )空格替换为零,用于所有匹配(
    g
    ),而不仅仅是第一个

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

    如果你想了解更多,网上有很多。特别好的是(大多数正则表达式引擎基本上与Perl兼容)

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

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


    响应于您的其他问题,我会说,而不是修改现有的名称,您可以考虑从文件内的ID3标签建立名称,而不是保持文件名在任何意义上都完好无损。您可以尝试“id3ren”

    echo 01-file.mp3 | sed-e的/^[0-9]+(.*)$/\1/'->什么也没发生。我删除了上面的“+”,删除了第一个0。我猜+应该是指重复的前一个序列?它没有按预期工作!尝试*而不是+。+通常表示regexp中最后一个令牌的1个或多个,*通常表示最后一个令牌的0个或多个。编辑:显然,您必须在sed:@Hari sundarajan:@Hari sundarajan:在mootinator的命令中的
    -e
    之前添加此项,以消除空格(并消除
    tr
    -e's///g'的需要,从而使完整的命令为:
    sed-e's///g'-e's/^[0-9]\+(.*)$/\1/'`。太棒了!太完美了。现在,你能告诉我一些在网上学习正则表达式的好参考资料吗?我能理解上面的大部分。3件事—(a)用[]和()括起来有什么区别?(b)我最后做了什么?(c)*是否意味着多个条目?非常感谢!
    sed -r -e 's/ +//g' -e 's/^[0-9]*[_-]*(.+\.mp3)$/\1/I'