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 ~]$