不定期分享shell脚本评测,喜欢我的文章,请关注我。
前言
我们在Linux系统中重命名一个文件时,大部分人首先想到的是使用mv命令,那么要是100万个文件呢?
如果使用mv那你要经历一个漫长等待的过程,实测需要30分钟以上,然而使用rename只用了不到1分多钟,相同服务器配置下这差距是简直不忍直视,需要注意的是mv是单个参数重复执行,而rename是使用通配符执行。
使用系统环境:Centos 7.6
Bash版本: v4.2.46
我们来看下shell脚本内容,这里我定义了三个函数,mk创建1万个目录并在每个最底层的子目录创建空文件,共计100万个空文件,rename_change函数使用rename命令修改文件名,mv_change函数使用mv命令修改文件名。
shell脚本
函数实现方式对比
#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
这里创建了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:通配符匹配。
这里修改了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
单次mv 重命名,就使用了0.002秒,100万*0.002大约是33分钟。
总结
在相同服务器配置下,mv命令单参数重命名,完败rename命令通配符重命令文件,执行效率相差46倍。
喜欢我的文章,请关注我,谢谢。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!