在bash shell中重命名一堆文件最简单的方法是什么?要将当前目录中的每个*.ext
文件重命名为*.otherext
?我接受使用perl或awk的解决方案,并不一定是纯粹的bash。有任何想法吗?在bash中使用perl或awk来改变多个文件的扩展名?
要清楚这将意味着:
mv a.ext a.otherext
mv b.ext b.otherext
...
etc. for all *.ext
在bash shell中重命名一堆文件最简单的方法是什么?要将当前目录中的每个*.ext
文件重命名为*.otherext
?我接受使用perl或awk的解决方案,并不一定是纯粹的bash。有任何想法吗?在bash中使用perl或awk来改变多个文件的扩展名?
要清楚这将意味着:
mv a.ext a.otherext
mv b.ext b.otherext
...
etc. for all *.ext
有几个方法可以做到这一点。有一个rename
程序用Perl写的:
rename 's/\.ext\z/.otherext/' *.ext
但也有另一种(不兼容)rename
各地的方案,为此,你不得不这样做:
rename .ext .otherext *.ext
还有一个叫mmv
程序:
mmv '*.ext' '#1.otherext'
使用普通的bash:
for i in *.ext; do mv -- "$i" "${i%.ext}.otherext"; done
使用普通的Perl:
perl -we 'for my $old (glob "*.ext") { (my $new = $old) =~ s/\.ext\z/.otherext/; rename $old, $new or warn "$old -> $new: $!\n"; }'
完美,谢谢!出于好奇,是否有相当于Python的一个班轮到你的Perl或是不可能的? – user248237dfsf 2013-02-25 05:07:59
对不起,我不知道python。 – melpomene 2013-02-25 05:08:19
简单Bash版本的+1。顺便说一句,不使用'--',另一种选择是使用'./*。ext'而不是'* .ext'来选择要迭代的文件。 – ruakh 2013-02-25 05:13:08
既然你问什么是Python版本可能的样子,我想我会添加它为后人。
#!/usr/bin/python
from glob import glob
from os import rename
for f in glob("*.ext"):
rename(f, f[:-3] + "otherext")
的一个行版本(而不是好看):
python -c "import glob,os;[os.rename(f, f[:-3] + \"otherext\") for f in glob.glob(\"*.ext\")]"
谢谢,但我的意思是它作为一个从shell的单线...我知道如何写它作为一个完整的脚本,但希望做一个快速的班轮。也许Python不适合这个? – user248237dfsf 2013-02-25 05:45:44
@ user248237添加了单行版本。 – squiguy 2013-02-25 06:01:44
一个Python的一行:
python -c "import shutil, glob; [shutil.move(i,i.replace('.txt','.ext')) for i in glob.glob('*.txt')]"
充分利用“和”,而不是转义字符及替换功能
检查此:http://theunixshell.blogspot.com/2012/12/changing-extension-of-large-number-of.html – Vijay 2013-02-25 06:37:10