一个班轮重命名一堆文件

时间:2012-03-26 17:50:47

标签: linux file rename

我正在寻找一个linux命令行one-liner来一次性重命名一堆文件。

pattern1.a  pattern1.b pattern1.c ...

一旦命令执行,我应该

pattern2.a  pattern2.b pattern2.c ...

3 个答案:

答案 0 :(得分:13)

for i in pattern1.*; do mv -- "$i" "${i/pattern1/pattern2}"; done

在您运行之前,请在echo前面贴上mv,以查看 所做的事情。

答案 1 :(得分:11)

如果您正在使用Linux,您可能还在/ usr / bin / rename中有一个perl脚本,根据比shell globbing许可更复杂的模式重命名文件。

我的一个系统上的/ usr / bin / rename记录为here。它可以像这样使用:

rename "s/pattern1/pattern2/" pattern1.*

许多other Linux environments似乎有不同的rename可能会像这样使用:

rename pattern1 pattern2 pattern1.*

检查系统上的man rename以获取详细信息。

答案 2 :(得分:1)

为这只猫皮肤提供了很多方法。如果你更喜欢你的模式是一个正则表达式而不是一个fileglob,并且你想要递归地进行更改,你可以使用这样的东西:

find . -print | sed -ne '/^\.\/pattern1\(\..*\)/s//mv "&" "pattern2\1"/p'

正如Kerrek建议他的回答,这个首先向你展示它会做什么。在您熟悉命令后,将输出通过shell(即将| sh添加到末尾)进行管道传输。

这对我有用:

[ghoti@pc ~]$ ls -l foo.*
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 foo.php
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 foo.txt
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p'
mv "./foo.txt" "bar.txt"
mv "./foo.php" "bar.php"
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' | sh
[ghoti@pc ~]$ ls -l foo.* bar.*
ls: foo.*: No such file or directory
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 bar.php
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 bar.txt
[ghoti@pc ~]$