2011-12-20 136 views
2

我有数百个相同格式的文件。我想通过取前六个字符和扩展名来重命名文件。如何使用shell脚本重命名所有文件?

下面的代码提取前6个字符...我展示他们

 for i in *.png; do echo $i | awk '{ print substr($0, 0, 7)}'; done 

我不能Concat的扩展。有人可以帮忙吗?如果脚本可以用mv命令完成,那将会很棒。

感谢

+0

所以你所有的文件至少有6个字符+分机:123456.png? – 2011-12-20 02:18:19

+1

是的,它们在6个字符内都是唯一的,或者重复无关紧要。这个问题显然意味着这一点。知道提问者有多确信实际上是这种情况会很有趣。 – 2011-12-20 02:24:37

+0

相关问题:[更好的方式基于多个模式重命名文件](http://stackoverflow.com/a/25597051/2654678)。 – 2014-08-31 23:13:26

回答

5

假设每个文件名的扩展名之前至少6个字符,你可以写

for file in *.png ; do mv "$file" "${file:0:6}.png" ; done 
+0

这真的很酷。不知道是否有任何书包含所有这些酷黑客。 +1 – 2011-12-20 03:12:52

+2

@JaypalSingh:全部都在[Bash参考手册](http://www.gnu.org/s/bash/manual/bash.html)中。它的 。 。 。不完全是“轻读”,但如果你在Bash工作很多,这是非常值得的。 – ruakh 2011-12-20 12:53:38

+0

感谢@ruakh的链接。 – 2011-12-20 16:39:24

1

做管道中的循环体之外,如果你继续使用awk

for i in *.png; do echo $i; done | 
awk '{ print "mv $0 " substr($0, 0, 7) ".png"}' | 
sh -vn 

修订后的awk将打印mv命令。当你高兴的时候,它会做正确的工作,用-x(或什么都不用)替换-vn

这将适用于几乎任何外壳。如果您专门使用bash,则可以使用内置的字符串操作来完成所需的工作 - 请参阅ruakh的答案,了解一种可能的技术。有无数的其他选项可供选择;某些系统具有能够执行rename命令(其他版本具有较低能力的版本)。

+0

请原谅我的无知,但不是'*我在* .png;做echo $ i;完成'更简洁地写成'echo * .png'? – Jens 2012-05-20 16:39:05

+0

循环和单个'echo'的区别在于循环将每个'单词'放在它自己的行上,而单个'echo'将所有单词放在一行上。你也可以编写一个'awk'脚本来处理这个脚本,但是你会对输入记录中的字段数量有一个明确的循环。我有一个微不足道的C程序,每行回应一个参数,并且发现它非常有用。多么微不足道?这个简单:'int main(int argc,char ** argv){while(* ++ argv!= 0)puts(* argv);返回0; }'当然,它也需要'#include '。 – 2012-05-20 17:47:12

+0

谢谢,我没有想到一条线与多条线。那么,让我们使用更多posixy'printf'%s \ n'* .png' :-) – Jens 2012-05-20 17:56:41