【问题标题】:Remove hyphens from a filename in Bash从 Bash 中的文件名中删除连字符
【发布时间】:2012-04-27 09:05:51
【问题描述】:

我进行了彻底的研究,以找到/创建一个适用于我想要实现的目标的脚本。

我正在尝试使用 Bash 更改多个文件名。在这种类型中,我试图只删除连字符:

YachtRescueVO-041512.mpg

YachtRescueVO041512.mpg

但是,同一目录中有更多文件。我正在尝试删除连字符和日期:

6CO1-041512.mpg

6C01.mpg

我很确定我需要一个正则表达式来对其进行排序,因为还有其他文件命名约定,例如 6B1A、3TSE1、CO1、11TSE3、TS1 等。我意识到这将是一个冗长的脚本。如果您有空闲时间,我将非常感谢您的帮助。

【问题讨论】:

  • 如何确定何时只删除连字符以及何时同时删除连字符和日期?
  • @idoperceive 你是真正发布我刚刚链接的问题的人。我在该问题上发布的答案正好解决了这个问题。它会在一个目录及其子目录中找到所有带有连字符的文件,并将它们全部重命名为没有连字符。
  • 蒂姆,您的脚本运行良好。粘性部分是后半部分。 John 简明扼要地描述了我的问题 - 我无法编写可以区分两种命名约定的脚本。
  • 如果你想不出规则,那么你写的程序也想不出规则。您必须知道哪些文件需要通过某种算法或启发式以哪种方式处理。如果您查看文件名,您能分辨出需要哪种类型的重命名吗?如果是这样,那么有一个算法......但你必须弄清楚它是什么并写下来。没人能猜到你。可能是“全部大写意味着删除连字符和日期;混合大小写意味着只需删除连字符'(当然忽略扩展名)。但是你必须知道,并且基于这些知识,你可以设计一种机制。

标签: bash shell rename


【解决方案1】:

好吧,我没有时间做这样的脚本,但我认为你应该看看以下命令:

  • sed
  • 重命名
  • awk

是的,正则表达式是一种非常有效的方法,但要真正提高语法的效率需要相当长的时间......

【讨论】:

    【解决方案2】:

    Bash parameter expansion

    假设文件名在var:

    new_var = ${var%-*}${var#*-}

    这对于您的第一个示例来说很好。第二个例子:

    new_var = ${var%-*}.${var#*.}

    我无法从您的问题中识别出您想要做什么替换。

    【讨论】:

      【解决方案3】:

      我已经在你问here 的问题中发布了这个,但如果你认为这是一个单独的问题,这将重命名目录及其子目录中的每个文件:

      for file in $(find dirWithDashedFiles -type f -iname '*-*'); do
        mv $file ${file//-/}
      done
      

      我在另一篇文章中陈述的所有警告都适用。

      您可以修改字符串操作以满足您的需要。例如,删除所有连字符后,您可以运行此命令以删除名称中带有 6C01 的文件的日期:

      for file in $(find dirWith6C01Files -type f -iname '6C01*'); do
        mv $file ${file%[0-9][0-9][0-9][0-9][0-9][0-9].mpg}.mpg
      done
      

      This site 提供了一些关于 bash 中字符串操作的信息,这些信息可以帮助您开始使用所需的正则表达式。

      注意:我不记得/找不到任何东西来指定要匹配的确切字符数,例如 egrep 中的 [0-9]{6}。如果有人发现它,请告诉我。

      【讨论】:

      • 感谢您的耐心和帮助。我终于可以把它拼凑成适合我情况的东西。谢谢!
      • 太棒了。您能为您的未决问题选择一个可接受的答案吗?
      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 2022-12-01
      • 2020-05-24
      • 2018-11-20
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多