虽然 mv
可以重命名文件或目录,但是不可以批量重命名也不支持正则表达式(不写脚本的情况下)
幸好Linux系统下还有个rename
命令可以使用,而且支持批量重命名和正则表达式。
rename
有两个版本,一种是c
语言版本、一种是Perl
版本,c版本比较古老,几乎已经绝迹,这句话我是从网上看见的,但是事实证明还没绝迹,至少centos6.7就是c语言版本的。
Perl
版本的更加强大,支持正则表达式,需要就是这个版本,google了一下找到了一个简略版。
地址:http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm#ch09-40514
代码:
#!/usr/bin/perl -w # rename - Larry's filename fixer $op = shift or die "Usage: rename expr [files]\n"; chomp(@ARGV = <STDIN>) unless @ARGV; for (@ARGV) { $was = $_; eval $op; die $@ if $@; rename($was,$_) unless $was eq $_; }
保存为 rename
,加上可执行权限就可以了
用法参考:
rename 's/\.orig$//' *.orig rename 'tr/A-Z/a-z/ unless /^Make/' * rename '$_ .= ".bad"' *.f rename 'print "$_: "; s/foo/bar/ if =~ /^y/i' * find /tmp -name '*~' -print | rename 's/^(.+)~$/.#$1/'
应用实例:
1. 批量修改文件后缀
./rename 's/\.htm$/\.html/' *.htm
2. 批量去除文件.bak
后缀
./rename 's/\.bak$//' *.bak
3. 批量添加.txt
后最
rename 's/$/\.txt/' *
4. 批量文件开头加上hello字符串
rename 's/^/hello/' *
5. 批量替换小写字母为大写
rename 'y/a-z/A-Z/' *
6. 批量去除文件名中的空格
rename 's/[ ]+//' *
7. 批量去除文件名的前缀
rename 's/^\[*.*\]//' *