了解rename命令的目的是为了解决批量修改文件名,因为在nginx日志进行切割的时候,遇到一个问题,nginx服务下有二三十个域名,每个域名下都有一个属于自己的日志,为了图简单,所以想找一个命令能够批量修改文件名,然后在进行重新reload一下,虽然logrotate也能实现,但是,习惯了使用脚本就不太愿意使用logrotate,而且,有些东西没有办法自己定义,下面就使用nginx日志切割这个要求举个例子看看rename是如何使用的吧。首先,我先使用shell脚本创建100个以".log"结尾的文件。
[root@wulaoer ngixn]# for i in seq 1 100 ;do touch access_$i.log ;done
我们创建了100个文件,然后创建一个json目录,等下把".log"结尾的文件都改成".json"格式。我们只修改格式也不行,也需要知道日志是那一天的日志,所以需要给".json"格式的文件增加一个日期,这样以后查找就方便了。
[root@wulaoer ngixn]# mkdir json
[root@wulaoer ngixn]# rename .log date +%Y%m%d".json" *.log
[root@wulaoer ngixn]# ll
总用量 0
-rw-r--r-- 1 root root 0 1月 15 14:49 access_10020200115.json
-rw-r--r-- 1 root root 0 1月 15 14:49 access_1020200115.json
-rw-r--r-- 1 root root 0 1月 15 14:49 access_1120200115.json
-rw-r--r-- 1 root root 0 1月 15 14:49 access_120200115.json
-rw-r--r-- 1 root root 0 1月 15 14:49 access_1220200115.json
-rw-r--r-- 1 root root 0 1月 15 14:49 access_1320200115.json
............................................................
这样修改之后,只是针对文件的后缀修改,后来看到rename也可以根据正则修改文件名,在自己的电脑上测试了一下,命令执行没有错误,但是文件没有修改,郁闷。有多看了一下,原来rename命令最初是使用C语言写的,后来使用perl语言,然后我根据我的命令查看了一下是C语言的,只有perl语言的rename才可以支持正则,那怎么办呢?能不能使用perl语言替换成C语言的rename,谷歌一下看了下,原来perl语言的rename使用的命令不一样,需要单独安装perl语言的rename,下面看一下perl语言的rename安装方法:
[root@wulaoer ngixn]# yum install epel-release -y #epel扩展包
[root@wulaoer ngixn]# yum install prename -y #安装prename包
安装成功之后我们测试一下perl语言的rename,这里需要注意perl语言的rename命令是prename,不是rename。还有一个,看网上有说判断rename是否是C语言还是perl语言使用man renme命令看第一行是RENAME(1) Linux Programmer’s Manual RENAME(1)还是RENAME(1) Perl Programmers Reference Guide RENAME(1),我测试了一下我的:
[root@wulaoer ngixn]# man rename
RENAME(1) User Commands RENAME(1)
NAME
rename - rename files
[root@wulaoer ngixn]# man prename
PRENAME(1) User Contributed Perl Documentation PRENAME(1)
NAME
prename - renames multiple files
不管是C语言的rename还是perl语言的rename,使用man rename都没有,我只能判断系统默认是C语言的rename,如果想使用perl语言的rename只能安装。下面看一下perl语言的rename使用方法:
[root@wulaoer ngixn]# prename 'y/a-z/A-Z/' *^C
[root@wulaoer ngixn]# ll
总用量 0
-rw-r--r-- 1 root root 0 1月 15 15:28 ACCESS_100.LOG
-rw-r--r-- 1 root root 0 1月 15 15:28 ACCESS_10.LOG
-rw-r--r-- 1 root root 0 1月 15 15:28 ACCESS_11.LOG
-rw-r--r-- 1 root root 0 1月 15 15:28 ACCESS_12.LOG
-rw-r--r-- 1 root root 0 1月 15 15:28 ACCESS_13.LOG
已经把所有小写字母替换成大写的,如果想把大写的替换成小写的,调整一下正则即可,下面我们尝试一下去掉".log"后缀
[root@wulaoer ngixn]# prename 's/\.log$//' *.log
[root@wulaoer ngixn]# ll
总用量 0
-rw-r--r-- 1 root root 0 1月 15 15:28 access_1
-rw-r--r-- 1 root root 0 1月 15 15:28 access_10
-rw-r--r-- 1 root root 0 1月 15 15:28 access_100
-rw-r--r-- 1 root root 0 1月 15 15:28 access_11
去掉了文件后缀,在给添加上去
[root@wulaoer ngixn]# prename 's/$/\.log/' *
[root@wulaoer ngixn]# ll
总用量 0
-rw-r--r-- 1 root root 0 1月 15 15:28 access_100.log
-rw-r--r-- 1 root root 0 1月 15 15:28 access_10.log
-rw-r--r-- 1 root root 0 1月 15 15:28 access_11.log
-rw-r--r-- 1 root root 0 1月 15 15:28 access_12.log
-rw-r--r-- 1 root root 0 1月 15 15:28 access_13.log
正则的基本使用方法应用有一个了解,这里着重说一下,rename和prename是两个语言,可以公用,但是需要注意命令,默认系统没有perl语言的prename,需要自己安装,C语言的rename没有正则,只有perl语言的rename才可以使用正则。没有了,看一些其他的吧!!!!!!!!!