Linux 如何编写bash脚本来替换文件中的单词,然后重命名文件?

Linux 如何编写bash脚本来替换文件中的单词,然后重命名文件?,linux,bash,replace,file-rename,Linux,Bash,Replace,File Rename,我有一个文件夹结构,如下所示: 我需要创建一个bash脚本,它可以完成4件事: 它搜索generic目录中的所有文件,找到字符串“generic”,并将其转换为“something” 如上所述,但将“GENERIC”更改为“SOMETHING” 如上所述,但将“Generic”更改为“Something” 将任何包含“generic”的文件名重命名为“something” 现在,我正在使用netbean中的search和replace手动执行这个过程。我对bash脚本不太了解,但我相信这是可以

我有一个文件夹结构,如下所示:

我需要创建一个bash脚本,它可以完成4件事:

  • 它搜索generic目录中的所有文件,找到字符串“generic”,并将其转换为“something”
  • 如上所述,但将“GENERIC”更改为“SOMETHING”
  • 如上所述,但将“Generic”更改为“Something”
  • 将任何包含“generic”的文件名重命名为“something”
  • 现在,我正在使用netbean中的search和replace手动执行这个过程。我对bash脚本不太了解,但我相信这是可以做到的。我在想我要运行的东西,它会以“某物”作为输入

    我从哪里开始?我应该使用什么功能?总体指导会很好。谢谢

    我正在使用Ubuntu 10.5桌面版。

    编辑 替换部分是一个
    sed
    脚本-称之为
    mapname

    sed -i.bak \
        -e 's/generic/something/g' \
        -e 's/GENERIC/SOMETHING/g' \
        -e 's/Generic/Something/g "$@"
    
    请注意,这也将更改注释和字符串中的单词,并将“generic”更改为单词的一部分,而不仅仅是整个单词。如果您只想要单词,那么可以在术语周围使用结束词标记:
    's/\/something/g'
    -i.bak
    创建备份

    您可以通过以下方式进行应用:

    find . -type f -exec mapname {} +
    
    它创建一个包含文件列表的命令并执行它。显然,如果愿意,您可以避免中间的
    mapname
    shell/sed脚本(通过在
    find
    命令中编写
    sed
    脚本代替
    mapname
    )。就个人而言,我更喜欢单独调试

    更名 重命名文件最好使用
    rename
    命令,该命令有两种变体,因此您需要阅读手册。使用以下两种方法之一:

    find . -name '*generic*' -depth -exec rename   generic something   {} +
    
    find . -name '*generic*' -depth -exec rename s/generic/something/g {} +
    
    (感谢您指出我使用的是一个功能更强大的基于Perl的变体
    rename
    ,具有完整的Perl regexp功能,感谢您指出Perl版本也可以在现实世界中找到*)

    注:

    • 这将重命名目录
    • 可能值得将
      -depth
      保存在其中,以便在目录之前重命名目录的内容;否则,您可能会收到消息,因为您重命名了目录,然后找不到其中的文件(因为
      find
      为您提供了旧名称)
    • 更基本的
      重命名
      只会将
      /generic/do_generic.java
      移动到
      /something/do_generic.java
      。您需要多次运行该命令才能更改每个文件名的每个组件

    *我使用的
    rename
    版本是根据《骆驼》第一版中的代码改编的。

    编辑 替换部分是一个
    sed
    脚本-称之为
    mapname

    sed -i.bak \
        -e 's/generic/something/g' \
        -e 's/GENERIC/SOMETHING/g' \
        -e 's/Generic/Something/g "$@"
    
    请注意,这也将更改注释和字符串中的单词,并将“generic”更改为单词的一部分,而不仅仅是整个单词。如果您只想要单词,那么可以在术语周围使用结束词标记:
    's/\/something/g'
    -i.bak
    创建备份

    您可以通过以下方式进行应用:

    find . -type f -exec mapname {} +
    
    它创建一个包含文件列表的命令并执行它。显然,如果愿意,您可以避免中间的
    mapname
    shell/sed脚本(通过在
    find
    命令中编写
    sed
    脚本代替
    mapname
    )。就个人而言,我更喜欢单独调试

    更名 重命名文件最好使用
    rename
    命令,该命令有两种变体,因此您需要阅读手册。使用以下两种方法之一:

    find . -name '*generic*' -depth -exec rename   generic something   {} +
    
    find . -name '*generic*' -depth -exec rename s/generic/something/g {} +
    
    (感谢您指出我使用的是一个功能更强大的基于Perl的变体
    rename
    ,具有完整的Perl regexp功能,感谢您指出Perl版本也可以在现实世界中找到*)

    注:

    • 这将重命名目录
    • 可能值得将
      -depth
      保存在其中,以便在目录之前重命名目录的内容;否则,您可能会收到消息,因为您重命名了目录,然后找不到其中的文件(因为
      find
      为您提供了旧名称)
    • 更基本的
      重命名
      只会将
      /generic/do_generic.java
      移动到
      /something/do_generic.java
      。您需要多次运行该命令才能更改每个文件名的每个组件


    *我使用的
    rename
    版本是根据《骆驼》一书第一版中的代码改编而成的。

    步骤1-3如下:

    find .../path/to/generic -type f -print0 |
        xargs -0 perl -pi~ -e \
            's/\bgeneric\b/something/g; 
             s/\bGENERIC\b/SOMETHING/g;
             s/\bGeneric\b/Something/g;'
    

    我不太明白您希望在步骤4中发生什么,因此我无法帮助您完成该部分。

    步骤1-3可以这样完成:

    find .../path/to/generic -type f -print0 |
        xargs -0 perl -pi~ -e \
            's/\bgeneric\b/something/g; 
             s/\bGENERIC\b/SOMETHING/g;
             s/\bGeneric\b/Something/g;'
    

    我不太明白你想在第4步中发生什么,所以我无法帮助你完成这一部分。

    我的
    man 1 rename
    说,如果没有
    s///
    语法,只需
    rename generic something{}
    就可以了。哦,太棒了,你把我需要的一切都放在这里了,我看到了。非常感谢。我相信基于Debian的发行版附带了基于perl的重命名,而Red Hat extended家族倾向于使用更基本的重命名,因此尝试使用这些指令的人可能需要其中一种语法。(值得一提的是,我喜欢华丽的perl正则表达式,它只是一个简单的脚本,如果没有它,您可以将它放到本地bin目录中。)+1很好!基于Debian的系统的Perl脚本为
    rename
    ,另一个脚本为
    rename.ul
    (如果您安装
    util linux
    )。我的
    man 1 rename
    说,如果没有
    s/
    语法,它将是简单的
    rename generic something{}
    。非常感谢。我相信基于Debian的发行版附带了基于perl的重命名,而红帽则扩展了它