刚学linux时,对文件重命名脑袋里立马呈现了rename命令,但却用不起来。G了一下,仍是一知半解,而且发现很多人对它也是很陌生!还有部分童鞋说直接使用mv,哎,mv还真管用,但老感觉命令名咋就那么不顺眼呢!
我们来man下吧,先man mv:
mv - move (rename) files
mv不仅有转移的功能,确实有重命名的含义,语法简单可理解为:
mv [path/]oldfilename [path/]newfilename
但只能是重名为当个文件。
我们再来man rename:
rename - renames multiple files
可以看出rename命令是专用于文件重命名的,而且是对批量文件重命名。
Linux的 rename版本
Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了, 由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C版本的都被Perl改写了,因为 Perl版本的支持正则处理,所以功能更加强大,已经不再需要C语言版本的了。
如何区分系统里的rename命令是哪个版本的?
输入 man rename 看到第一行是
RENAME(1) Linux Programmer’s Manual RENAME(1)
那么 这个就是C语言版本的。而如果出现的是:
RENAME(1) Perl Programmers Reference Guide RENAME(1)
这个就是Perl版本的了!
两个版本的语法差异
- C语言的,按照man上面的注解,rename的语法格式是:
rename fromtofile
d这个命令有三个参数,分别是 from : 修改什么名字, to:改成什么名字, file 需要修改的文件是哪些。
用法示例:比如,有一批文件,都是以 log开头的, log001.txt, log002.txt ....... 一直到 log100.txt,现在想要把这批文件的log全部替换为 history
rename log history log*
这句命令的意思很明白了,把 以 log开头的所有文件中的 log字符替换为 history,这样替换后的文件是: history001.txt, history002.txt ..... 一直到 history100.txt。
- Perl 版本的批量重命名,带有Perl的好处是,你可以使用正则表达式来完成很奇特的功能。perl 版本的参数格式:
rename perlexpr files
man rename的帮助示例:有一批文件,以 .bak结尾,现在想把这些 .bak 统统去掉:
rename ‘s/\.bak$//‘ *.bak
这个命令很简单,因为我还没有系统学习过perl,我不知道perl里替换字符串是不是这么干的,但sed是这么干的,所以如果你有sed或者tr基础,很容易明白,这个替换和sed里的正则语法是一模一样的。
总结:所以如果你只是重名一个文件,那么还是mv方便快捷!