rename批量修改文件名

avatar 2020年1月18日18:37:07 评论 2,789 次浏览

了解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才可以使用正则。没有了,看一些其他的吧!!!!!!!!!

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: