忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 483 | 回复: 6

[文本处理] 文件名改名求助 [复制链接]

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-03-09 15:00 |显示全部楼层
[ 本帖最后由 bikkuri 于 2017-03-09 15:40 编辑 ]\n\n大家好!
我有一个问题向大家请教。
在服务器上有这样一些文件。


[root@hp8:/tmp/ar]# ls -l *.ts
...
-rw-r--r-- 1 root root   288288 Mar  8 09:37 VINC-311-ACR-1-10.0.3.11-2017-03-08_093659.ts
-rw-r--r-- 1 root root   288284 Mar  8 09:57 VINC-311-ACR-1-10.0.3.11-2017-03-08_095659.ts
-rw-r--r-- 1 root root   286196 Mar  8 10:11 WAND-329-ACR-1-10.0.3.29-2017-03-08_101118.ts
-rw-r--r-- 1 root root   286256 Mar  8 10:31 WAND-329-ACR-1-10.0.3.29-2017-03-08_103120.ts
-rw-r--r-- 1 root root   282500 Mar  8 12:16 WARA-248-ACR-1-10.0.2.48-2017-03-08_121608.ts
-rw-r--r-- 1 root root   282544 Mar  8 12:36 WARA-248-ACR-1-10.0.2.48-2017-03-08_123608.ts
-rw-r--r-- 1 root root   284664 Mar  8 09:38 WARE-213-ACR-1-10.0.2.13-2017-03-08_093747.ts
-rw-r--r-- 1 root root   284572 Mar  8 09:58 WARE-213-ACR-1-10.0.2.13-2017-03-08_095747.ts
-rw-r--r-- 1 root root   283044 Mar  8 10:06 WELE-222-ACR-1-10.0.2.22-2017-03-08_100550.ts
-rw-r--r-- 1 root root   282856 Mar  8 10:26 WELE-222-ACR-1-10.0.2.22-2017-03-08_102551.ts
-rw-r--r-- 1 root root   381692 Mar  8 09:11 YELM-262-ACR-1-10.0.2.62-2017-03-08_091101.ts
-rw-r--r-- 1 root root   380848 Mar  8 09:31 YELM-262-ACR-1-10.0.2.62-2017-03-08_093101.ts


这些文件的命名规则是:hostname-IP-Date_Time.ts。
例如:(YELM-262-ACR-1)-(10.0.2.62)-(2017-03-08)_(093101).ts
现在希望将这些文件以以下规则进行改名:
1.将hostname和IP相同的一对文件,其中Date_Time比较小的文件改名为hostname-IP.ts1,另外一个改名为hostname-IP.ts2;
2.如果有单个的hostname-IP-Date_Time.ts没有找到hostname和IP相同的另一个文件,则将其改名为hostname-IP.ts1。

如果只是单个的文件的改名,可以用下面的代码实现:

name=YELM-262-ACR-1-10.0.2.62-2017-03-08_093101.ts
ip=$(echo $name|grep -oP '((\d){1,3}\.){3}(\d){1,3}');
date=$(echo $name|grep -oP '(\d){4}-(\d){2}-(\d){2}');
time=$(echo $name|grep -oP '(\d){6}');
newname=$(echo $name|awk -v ip=$ip -F "-" '{for(i=1;i<=NF;i++)a[i]=$i;for(j=1;j<=i;j++){printf a[j];if(a[j]==ip){printf".ts1";break}else{printf"-"}}}')

[root@hp8:/tmp/ar]# echo $newname
YELM-262-ACR-1-10.0.2.62.ts1

但是如果要实现文件对的改名,应该怎么做呢?
谢谢大家的指点。


论坛徽章:
115
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-09 16:13 |显示全部楼层
回复 1# bikkuri

$ ls *.ts
VINC-311-ACR-1-10.0.3.11-2017-03-08_093659.ts
VINC-311-ACR-1-10.0.3.11-2017-03-08_095659.ts
...
YELM-262-ACR-1-10.0.2.62-2017-03-08_091101.ts
YELM-262-ACR-1-10.0.2.62-2017-03-08_093101.ts

$ ls *.ts | awk -F- -vmv=no '/[.]ts$/{org=$0;hn=$1;ip=dt="";for(n=2;n<=NF;++n){if(split($n,x,"[.]")==4)ip=$n;if(!ip)hn=hn FS $n;else dt=dt FS $n};hnip=hn"-"ip;if(a[hnip]++)next;cmd="ls "hnip"*.ts";c=0;delete F;while(cmd | getline f)F[++c]=f;close(cmd);if(c>2)next;if(c==2){if(F[1]>F[2]){F[2]=F[1];F[1]=f};for(n=1;n<=c;++n){cmd="mv "F[n]" "hnip".ts"n;print cmd;if(mv=="yes")system(cmd)}}}'
mv VINC-311-ACR-1-10.0.3.11-2017-03-08_093659.ts VINC-311-ACR-1-10.0.3.11.ts1
mv VINC-311-ACR-1-10.0.3.11-2017-03-08_095659.ts VINC-311-ACR-1-10.0.3.11.ts2
...
mv YELM-262-ACR-1-10.0.2.62-2017-03-08_091101.ts YELM-262-ACR-1-10.0.2.62.ts1
mv YELM-262-ACR-1-10.0.2.62-2017-03-08_093101.ts YELM-262-ACR-1-10.0.2.62.ts2

# double check and no issue


$ ls *.ts | awk -F- -vmv=yes '/[.]ts$/{org=$0;hn=$1;ip=dt="";for(n=2;n<=NF;++n){if(split($n,x,"[.]")==4)ip=$n;if(!ip)hn=hn FS $n;else dt=dt FS $n};hnip=hn"-"ip;if(a[hnip]++)next;cmd="ls "hnip"*.ts";c=0;delete F;while(cmd | getline f)F[++c]=f;close(cmd);if(c>2)next;if(c==2){if(F[1]>F[2]){F[2]=F[1];F[1]=f};for(n=1;n<=c;++n){cmd="mv "F[n]" "hnip".ts"n;print cmd;if(mv=="yes")system(cmd)}}}'
mv VINC-311-ACR-1-10.0.3.11-2017-03-08_093659.ts VINC-311-ACR-1-10.0.3.11.ts1
mv VINC-311-ACR-1-10.0.3.11-2017-03-08_095659.ts VINC-311-ACR-1-10.0.3.11.ts2
...
mv YELM-262-ACR-1-10.0.2.62-2017-03-08_091101.ts YELM-262-ACR-1-10.0.2.62.ts1
mv YELM-262-ACR-1-10.0.2.62-2017-03-08_093101.ts YELM-262-ACR-1-10.0.2.62.ts2

$ ls *.ts?
VINC-311-ACR-1-10.0.3.11.ts1  WARE-213-ACR-1-10.0.2.13.ts1
VINC-311-ACR-1-10.0.3.11.ts2  WARE-213-ACR-1-10.0.2.13.ts2
WAND-329-ACR-1-10.0.3.29.ts1  WELE-222-ACR-1-10.0.2.22.ts1
WAND-329-ACR-1-10.0.3.29.ts2  WELE-222-ACR-1-10.0.2.22.ts2
WARA-248-ACR-1-10.0.2.48.ts1  YELM-262-ACR-1-10.0.2.62.ts1
WARA-248-ACR-1-10.0.2.48.ts2  YELM-262-ACR-1-10.0.2.62.ts2

评分

参与人数 1信誉积分 +10 收起 理由
bikkuri + 10 很给力!太感谢了!

查看全部评分

论坛徽章:
0
发表于 2017-03-09 16:15 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-03-09 16:22 编辑

对于powreshell而言,就是
1 new一个空的文件对象,给对象添加一个自定义属性,给个名字,如分组ip。
2 用dir输出所有文件对象,依次过滤,从文件名中找出ip,放入这个属性。
3 按照这个名字分组对象,即按服务器ip分组。powershell的优势是 自带 group-object命令。可以少写不少代码。
4 遍历每个分组。if 每个分组中只有一个文件,则。if 每个分组中只有2个文件,则。

我想awk道理也是类似。powershell简单强大不?


论坛徽章:
115
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-09 16:25 |显示全部楼层
本友会机友会摄友会 发表于 2017-03-09 16:15
对于powreshell而言,就是
1 new一个空的文件对象,给对象添加一个自定义属性,给个名字,如分组ip。
2  ...

别老光说不练...

简单强大,就写一个来用呗...

论坛徽章:
0
发表于 2017-03-09 16:34 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-03-09 16:37 编辑

他是嵌入式linux吧?貌似只有awk。还是busybox不兼容版本的。
不过呢,可以用docker版的linux powershell。然后把目录暴露给docker,如:
mkdir /powershell
docker run -it -v /powershell:/mnt      microsoft/powershell:centos7  
#运行centos7的powershell docker,并把本地/powershell目录,映射到docker内部的/mnt目录

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-03-09 16:59 |显示全部楼层
谢谢json680大神的指点。
看来我还是数组不过关,写了一下午都没写出来。
我好好学习一下大神的神代码。

回复 2# jason680



论坛徽章:
27
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-03-09 17:19 |显示全部楼层

  1. a=$(ls *.ts|sort -t'_' -k1,1 -k2n)
  2. awk 'NR==FNR{match($0,/([^.]+[^-]+)/,a);b[a[1]]++;next}{match($0,/([^.]+[^-]+)/,c);if(b[c[1]]>1){system("mv "$0" "c[1]".ts1");getline;system("mv "$0" "c[1]".ts2")}else{system("mv "$0" "c[1]".ts1")}}' <(echo "$a") <(echo "$a")
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票8.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP