在bash中使用一个内核(使用perl或awk)来更改多个文件的扩展名?

时间:2013-02-25 04:57:23

标签: perl bash shell unix awk

bash shell中最简单的方法是重命名一堆文件?要将当前目录中的每个*.ext文件重命名为*.otherext?我对使用perl或awk的解决方案持开放态度,不必是纯粹的bash。有什么想法吗?

要明确这意味着:

mv a.ext a.otherext
mv b.ext b.otherext
...
etc. for all *.ext

3 个答案:

答案 0 :(得分:10)

有几种方法可以做到这一点。有一个用Perl编写的rename程序:

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

使用plain perl:

perl -we 'for my $old (glob "*.ext") { (my $new = $old) =~ s/\.ext\z/.otherext/; rename $old, $new or warn "$old -> $new: $!\n"; }'

答案 1 :(得分:2)

既然你问过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\")]"

答案 2 :(得分:0)

蟒蛇单行:

python -c "import shutil, glob; [shutil.move(i,i.replace('.txt','.ext')) for i in glob.glob('*.txt')]"

利用'和'代替转义字符和替换功能