2011-03-22 55 views

回答

7
find . -type f -name '*.a' -print0 | xargs -0 -IZZ mv ZZ ZZ.b 

这应该处理与空间和/或换行符的文件名。它也不会重命名目录(另一种解决方案在做查找)。如果你希望它是不区分大小写,使用 “-iname” 代替 “-name”

1

要重命名<files>那个,rename 's/\.a$/.a.b/' <files>。这样做递归地只需要一些循环。

(或使用**/**/*/**/*/*/*等为文件)

+0

如果bash的4,然后'禁用了javascript -s globstar'和使用''**对不起 – 2011-03-22 13:43:06

1

尝试下面的脚本:

for file in `find . -name '*.a'`; do mv $file $file.b; done 
+3

,但不会处理在正确的文件名中的空格和换行 - 你可能想使用-print0和xargs的尝试 - 代替0。 – George 2011-03-22 02:18:39

+0

或者:找。 -name'* .a'|同时读-r x;做mv“$ x”“$ x.b”;完成 – 2011-03-22 09:04:18

2

红宝石(1.9+)

$ ruby -e 'Dir["**/*.a"].each{|x|File.file?x && File.rename(x,"#{x}.b")}' 

在shell脚本(至少巴什4)

shopt -s globstar 
shopt -s nullglob 
for file in **/*.a 
do 
echo mv "${file}" "${file}.b" 
done 
+0

对不起,我的浏览器似乎在显示不同的答案。我现在看到的版本肯定是递归的。这似乎也是一个很好的解决方案! – 2011-03-22 02:26:07