免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5660 | 回复: 6
打印 上一主题 下一主题

求助:一个批量修改文件名的要求(移动文件名一部分字符的位置) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-04 13:38 |只看该作者 |倒序浏览
我有一批文件需要改名,具体要求如下:

原文件名:
bbs2007_04_16.access.log
bbs2007_04_17.access.log
...
想把文件名改为日期在后的形式:
bbs.access.log.20070416
bbs.access.log.20070417
....

我对shell不熟悉,麻烦高人出马,谢谢!

论坛徽章:
0
2 [报告]
发表于 2007-05-04 13:47 |只看该作者
for i in *.log;do mv $i `echo $i|sed 's/_//g;s/\(bbs\)\([0-9]\{8\}\)\(.*\)/\1\3.\2/'`;done

你要重命名文件就这样写

[ 本帖最后由 fangdingj 于 2007-5-4 16:47 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-05-04 15:29 |只看该作者
...没看懂....

论坛徽章:
0
4 [报告]
发表于 2007-05-04 16:50 |只看该作者
开始没注意你的要求,上面我修改了一下

论坛徽章:
0
5 [报告]
发表于 2007-05-04 17:00 |只看该作者
ls|while read file; do mv $file `echo $file|sed 's/bbs\(.*\)_\(.*\)_\([0-9]*\)\.\(.*$\)/bbs.\4.\1\2\3/'`; done

[ 本帖最后由 ddie 于 2007-5-4 17:25 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-05-05 00:45 |只看该作者
原帖由 fangdingj 于 2007-5-4 13:47 发表
for i in *.log;do mv $i `echo $i|sed 's/_//g;s/\(bbs\)\([0-9]\{8\}\)\(.*\)/\1\3.\2/'`;done

你要重命名文件就这样写


谢谢,又看了一下sed的说明,理解如下,不知是否正确?

  1. for i in *.log;
复制代码

定义循环:针对每一个log文件进行操作
  1. do mv $i `echo $i|sed 's/_//g;s/\(bbs\)\([0-9]\{8\}\)\(.*\)/\1\3.\2/'`;
复制代码

        执行改名操作,第一个参数是原始文件名,第二个参数就是经过sed编辑修改后的文件名,具体的修改过程可以分解成以下几步:

  1. echo $i   
复制代码

第一步:把文件名作为参数传递给sed
  1. |sed 's/_//g;
复制代码

第二步:把所有日期中间的下划线删除(也就是用空字符替换下划线)
  1. s/\(bbs\)\([0-9]\{8\}\)\(.*\)
复制代码

第三步,把修改过日期格式的文件名分解成三段:1:bbs三个字符(\(bbs\));2:8位日期(\([0-9]\{8\}\));3:文件名剩余部分(.access.log)(\(.*\)
  1. /\1\3.\2/'
复制代码

第四步:按照要求修改文件名,也就是将上一步分解出来的三部分重新组合为:1:bbs三个字符;(也就是上一步的1)2:文件名剩余部分(.access.log)(也就是上一步分解出来的3)再加上一个“.”;3:8位日期(也就是上一步分解出来的2)
  1. Done     
复制代码

结束循环

按照以上理解,如果我不需要删除日期中间的下划线的话,命令应该修改如下:

  1. for i in *.log;do mv $i `echo $i|sed 's/\(bbs\)\([0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}\)\(.*\)/\1\3.\2/'`;done
复制代码


效果就是把文件名
bbs2007_04_16.access.log
bbs2007_04_17.access.log
.......
修改成:
bbs.access.log.2007_04_16
bbs.access.log.2007_04_17

[ 本帖最后由 jeff183 于 2007-5-5 00:46 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2007-05-05 01:21 |只看该作者
ls *.log|awk -F. '{print "mv "$0,substr($1,1,3)"."$2"."$3"."substr($1,4,10)}'|sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP