Linux:如何用指定的字符替换部分文件名

时间:2018-05-22 01:48:10

标签: linux find

我想用指定的字符替换部分文件名。

例如:

$ ls
SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml

我想将RNCRAM955E替换为RNCMST954E

这是我预期的输出。

$ ls
SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml

以下是我的代码:

$ find ./ -name '*.xml' | xargs -i echo mv {} {} | sed 's/RNCRAM955E/RNCMST954E/3g' | sh

mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml
mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml
mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml 
mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml

我无法理解3g的代码究竟是什么意思。

在我看来:     sed s/xx/xx/3g是否意味着将匹配模式从第3个替换为结尾,sed s/xx/xx/3表示仅替换第3个匹配模式?     顺便说一下,|sh的确切含义是什么,我认为它会使echo之后的命令作为shell执行,对吗?

1 个答案:

答案 0 :(得分:0)

3表示替换第3场比赛,g表示替换所有比赛。当你一起使用它时,它意味着从第3个开始替换所有匹配。

管道到sh意味着执行sed的输出作为shell命令。

大多数Linux发行版都有一个rename命令,可以让这更容易:

find . -name '*.xml' -exec rename 's/RNCRAM955E/RNCMST954E/' {} +