如何使用Bash重命名多个文件名中间的小部分?

22

我只是想修改这个

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和第二个星号之间没有空格,这只是使它斜体的方式,据我所见。基本上,对于文件名末尾的情况,有很多答案可以解决,其中星号似乎起作用,但在这里我无法使其起作用。

任何你能提供的东西都会让我的生活更加轻松!

编辑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 

为什么要使用rename ".13" ".15"而不是rename "_13" "_15" - chepner
5个回答

32

这样怎么样:

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

这将会在所有扩展名为.II的文件中,使用sed命令将_13替换成_15

更多有关sed的信息可以在这里找到。


21

一个纯 bash 解决方案:

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

1
我建议像这样添加引号,这样文件名中的空格就不会有问题: for i in cc*; do mv "$i" "${i/_13/_15}"; done - syss
@user234461 不是的,参数扩展使用通配符模式,而不是正则表达式。 - chepner

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

这应该符合你的要求。正则表达式 s/_13/_15/ 将所有以 'cc' 开头的文件中的 _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,要检查你所拥有的版本,请输入man rename。如果页面顶部显示:

Perl 程序员参考指南

则说明你有 Perl 版本。如果显示:

Linux 程序员手册

则说明你有标准(旧版)版本。

对于旧版,命令应该是:

rename _13 _15 cc*

我的命令行好像没能正常运行,参见编辑1,我做错了什么? - cc211
1
我认为我们有不同版本的“rename”命令。我已经编辑了我的答案并提供了更多细节,希望能帮到你! - John Lawrence
3
rename 是 Perl 软件包中的命令行工具,也被称为 prename。它可以使用无限复杂的 Perl 表达式,因此 prename -n 'use LWP::Simple;my $http=get("http://airport-authority.com/browse-FR");while($http=~m/>([^<>]+)<\/a> \((\w\w\w)\)/gc){my $from=$2;my $to=$1;$to=~s/ /_/g;s/$from/$to/g};' MRS_DOLLY_PARTON.MP3 PUFF_DADDY.MP3 将文件名中的三个字母代码重命名为带下划线的法国机场名称,在这种情况下,两个 MP3 文件被重命名为 Marseille_Airport_St_Gatien_AirportLY_PARTON.MP3Uzein_AirportF_DADDY.MP3 - David Andersson

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

希望它有所帮助


0
在这种情况下,您可以使用以下命令:
rename -v "_130" "_150" *.II

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接