centos7执行sh文件_shell脚本100万文件批量重命名,mv执行效率对比rename,完败

不定期分享shell脚本评测,喜欢我的文章,请关注我。

前言

我们在Linux系统中重命名一个文件时,大部分人首先想到的是使用mv命令,那么要是100万个文件呢?

如果使用mv那你要经历一个漫长等待的过程,实测需要30分钟以上,然而使用rename只用了不到1分多钟,相同服务器配置下这差距是简直不忍直视,需要注意的是mv是单个参数重复执行,而rename是使用通配符执行。

使用系统环境:Centos 7.6

Bash版本: v4.2.46

84a55af57ec74475b5d4fbc3ddb06456

我们来看下shell脚本内容,这里我定义了三个函数,mk创建1万个目录并在每个最底层的子目录创建空文件,共计100万个空文件,rename_change函数使用rename命令修改文件名,mv_change函数使用mv命令修改文件名。

ecf15d95b45f4e95812ed4786b0a0d89

shell脚本

函数实现方式对比

  • mv 是按照匹配文件的相对路径,重复只执行单条命令,相当于每次获取一个入参,配合内置变量修改文件名。
  • rename是按照匹配到的文件的整个目录配合通配符执行,相当于每次的入参是整个目录,在rename通配符的特性,使用通配符匹配整个目录下的txt文件,这样就实现多个入参。
  • 如果服务器配置高的话可以使用,xargs -i 可将参数递给mv或者rename,每次只传递一个参数给命令,和使用for语句传递参数同理。
  • -P 0 可调度所有cpu进行最大限度并行处理,我服务器配置很低,单核2G,即使使用xargs,也没有rename_change执行效率高。
#find ./ -name *.txt|xargs -P 0 -i rename .txt .log .{}#find ./ -name *.txt|awk -F '[.]' '{print $2}'|xargs -P 0 -i mv {}.txt {}.log

使用mk函数创建100万个txt后缀空文件

首先使用mk函数创建100万个文件,这个函数定义了多级目录,我主要考虑的是需要修改文件名的文件,在多级子目录下,函数里包含了mkdir和touch命令的特殊用法。

##函数示例mkmk () {mkdir -p {1..100}/{1..100}for i in $(find ./ -mindepth 2 -type 'd');do touch $i/{1..100}.txtdone}#mkdir -p {1..100}/{1..100} ##在当前目录下创建名称为1-100的目录,并在这1-100每个目录下创建1-100的目录。#mkdir -p m/{n1,n2,n3}/{d1,d2,d3},n4}##扩展用法创建m目录,并在n1,n2,n3,n4,在n3目录下创建d1,d2,d3。

在终端命令. mk.sh调用脚本里的环境到当前shell,"."和source命令是一样的效果,然后执行time mk查看创建100万个空文件用时。

[root@api change]# . ../mk.sh[root@api change]# time mk
0e2108b5845c41e1a72b2402b756e09c

这里创建了100万个txt格式的空文件,用时55秒,速度还是不错的。在创建多个有规律的文件或目录时,使用mkdir和touch的特殊用法能够提升不少执行效率。

使用rename_change函数修改txt后缀为log后缀

接下使用rename_change函数将txt后缀修改成log后缀,

##函数示例rename_changerename_change () {Type='txt'newtype='log'for i in $(find ./ -name *.${Type}|xargs dirname|sort|uniq);do rename .${Type} .${newtype} ${i}/*.txtdone}#find ./ -name *.${Type}|xargs dirname|sort|uniq##查找当前目录下的所有的txt文件,使用xargs命令将所有的文件绝对路径,传递给dirname获取到所有文件的目录名称,sort命令排序,uniq将去重复,最终获取到所有文件的目录。#rename .txt .log ${i}/*.txt##rename可以使用通配符,参数1:被字符串,参数2:替换的字符串,参数3:通配符匹配。
8e7dbb4d162749339fcea9a6549f9324

这里修改了100万个文件,只用了43秒,执行效率已经非常高了。

使用mv_change函数重复名文件

mv_change函数其实和下面使用xargs 的效果差不多,每一次都是执行一个参数,修改100万个文件那就只能计算修改一个文件用时,相乘计算了。

#find ./ -name *.txt|awk -F '[.]' '{print $2}'|xargs -P 0 -i mv {}.txt {}.log##函数示例mv_change () {Type='txt'newtype='log'for i in $(find ./ -name *.txt);do mv $i ${i%.*}.${newtype}done}#这里需要提到的是${i%.*}bash内置用法,它替代了awk命令,执行效率也提升不少。#执行# time mv ./86/10/44.log ./86/10/44.txt
097b6ff340054635ad478ce37196c83c

单次mv 重命名,就使用了0.002秒,100万*0.002大约是33分钟。

总结

在相同服务器配置下,mv命令单参数重命名,完败rename命令通配符重命令文件,执行效率相差46倍。

喜欢我的文章,请关注我,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值