Linux 如何编写bash脚本来替换文件中的单词,然后重命名文件?
我有一个文件夹结构,如下所示: 我需要创建一个bash脚本,它可以完成4件事: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脚本不太了解,但我相信这是可以
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的重命名,而红帽则扩展了它