一个class轮重命名一堆文件

我一直在寻找一个Linux命令行来一次重命名一堆文件

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

一旦命令执行,我应该得到

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

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

在运行之前,在mv前面粘上一个echo ,看看做什么。

如果你恰好在使用Linux,你也可以在/ usr / bin /下重命名一个perl脚本,根据比shell globbing许可更复杂的模式重命名文件。

/ usr / bin /重命名我的系统之一是记录在这里 。 它可以这样使用:

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

许多其他Linux环境似乎有不同的rename ,可能会这样使用:

 rename pattern1 pattern2 pattern1.* 

检查你的系统上的man rename的细节。

很多方法来剥皮这只猫。 如果你更喜欢你的模式是一个正则表达式,而不是一个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 ~]$