【问题标题】:How do I Remove Specific Characters From File Names Using BASH如何使用 BASH 从文件名中删除特定字符
【发布时间】:2009-09-30 19:33:03
【问题描述】:

我有很多文件,它们的名称中有一个共享模式,我想删除它们。例如,我有文件“a_file000.tga”和“another_file000.tga”。我想对那些会从名称中删除模式“000”的文件进行操作,从而产生新名称“a_file.tga”和“another_file.tga”。

【问题讨论】:

    标签: bash


    【解决方案1】:

    Bash 可以做类似sed 的替换:

    for file in *; do mv "${file}" "${file/000/}"; done
    

    【讨论】:

    • 在 OS X (10.6.8) 上运行良好。方便又简洁。谢谢。
    • 很好,你能解释一下“{”的作用吗?
    • 有关此功能的文档,请参阅 Bash 参考手册 中的第 3.5.3 节 Shell Parameter Expansion,查找 ${parameter/pattern/string}。更详细的参数替换示例可以在 Advanced Bash-Scripting Guide 的第 10.2 节 Parameter Substitution 中找到。
    • @irnc:另一个:Parameter Expansion
    • 最佳答案,IMO。
    【解决方案2】:

    试试这个(这也适用于普通的老 Bourne sh):

    for i in *000.tga
    do
        mv "$i" "`echo $i | sed 's/000//'`"
    done
    

    两个参数都用引号括起来以支持文件名中的空格。

    【讨论】:

    • +1 适用于大多数便携式解决方案(而且因为我的支持率太低,无法继续支持所有好的答案)。
    【解决方案3】:

    使用重命名,可能需要在linux上安装,它的python脚本

    rename (option) 's/oldname/newname' ...
    

    所以你可以像这样使用它

    rename -v 's/000//' *.tga
    

    这意味着我们正在指示替换该文件夹中所有扩展名为 .tga 的文件,以将 000 替换为空白空间。希望有效

    您可以查看this 链接了解更多信息和here

    【讨论】:

      【解决方案4】:

      一个非 bash 解决方案,因为我知道两个快速的海报已经涵盖了这一点:

      有一个非常棒的简短 perl 程序,称为 rename,它默认安装在某些系统上(其他系统的重命名程序不太有用)。它允许您使用 perl 正则表达式进行重命名,例如:

      rename 's/000//' *000*.tga
      

      【讨论】:

        【解决方案5】:
        #!/bin/bash
        ls | while read name; do
          echo mv $name ${name/$1//}
        done
        

        【讨论】:

        • @Laurence Gonsalves:使用 shell 通配符扩展命令行,并且限制不是很大。 “阅读时”避免了这种情况
        • @Laurence:这也更具可扩展性。常用在前面find
        • while read 是一种改进(如果使用正确,使用空的IFS-r,以及-d '' 和NUL 分隔的输入流),但ls 是相反。见Why you shouldn't parse the output of ls
        猜你喜欢
        • 2020-05-24
        • 2013-01-18
        • 1970-01-01
        • 2012-04-26
        • 2015-09-24
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多