Bash:重命名名称中间的多个文件的一小部分

时间:2012-06-15 15:18:41

标签: bash

我只想改变这个

cc211_AMBER_13062012i.II  cc211_GROMOS_13062012i.II
cc211_CHARM_13062012i.II  cc211_OPLS_13062012i.II

cc211_AMBER_15062012i.II  cc211_GROMOS_15062012i.II
cc211_CHARM_15062012i.II  cc211_OPLS_15062012i.II

我试过了,

find -name "*.13 *" | xargs rename ".13" ".15"

在3和第二个星号之间通常没有空间,这就是我所看到的斜体。基本上有很多答案可以解释当它在文件名末尾时该做什么,其中asterix似乎有用,但在这里我无法使它工作。

你得到的任何东西都会让我的生活变得更轻松!

编辑1:试用

-bash-4.1$ ls

cc211_AMBER_13062012.II  cc211_GROMOS_13062012.II
cc211_CHARM_13062012.II  cc211_OPLS_13062012.II

-bash-4.1$ rename 's/_13/_15/' cc*
-bash-4.1$ ls

cc211_AMBER_13062012.II  cc211_GROMOS_13062012.II
cc211_CHARM_13062012.II  cc211_OPLS_13062012.II 

谢谢,

查理

4 个答案:

答案 0 :(得分:25)

这个怎么样:

for i in *.II; do mv $i $(echo $i | sed 's/_13/_15/g'); done

这将在_13

的所有文件中将_15替换为.II

有关sed here的更多信息。

答案 1 :(得分:19)

bash解决方案:

for i in cc*; do
  mv "$i" "${i/_13/_15}"
done

答案 2 :(得分:6)

rename 's/_13/_15/' cc*

应该做你想做的事。在所有以'cc'开头的文件中,正则表达式s/_13/_15/_13替换为_15

$ ls
cc211_AMBER_13062012.II  cc211_GROMOS_13062012.II
cc211_CHARM_13062012.II  cc211_OPLS_13062012.II

$ rename 's/_13/_15/' cc*

$ ls
cc211_AMBER_15062012.II  cc211_GROMOS_15062012.II
cc211_CHARM_15062012.II  cc211_OPLS_15062012.II

这只适用于较新的rename perl版本。要查看您执行的版本man rename。如果页面顶部显示

  

Perl程序员参考指南

你有perl版本。如果它说:

  

Linux程序员手册

你有标准(旧)版本。

对于旧版本,命令应为:

rename _13 _15 cc*

答案 3 :(得分:0)

我正在使用纯Linux解决方案:

### find all files that contains _DES in name and duplicate them adding _AUXLOCAL
for f in **/*_DES*; do
    cp "$f" "${f%.DES}_AUXLOCAL"
done 
###Rename all _AUXLOCAL files, removing _DES to _LOCAL
for f in **/*_AUXLOCAL*; do
  mv "$f" "${f/_DES/_LOCAL}"
done
###Rename all _AUXLOCAL files, removing _AUXLOCAL
for f in **/*_AUXLOCAL*; do
  mv "$f" "${f/_AUXLOCAL/}"
done

我希望它有所帮助