免费注册 查看新帖 |

Chinaunix

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

perl 修改文件名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-24 09:49 |只看该作者 |倒序浏览
本帖最后由 qizhi502 于 2011-01-05 16:17 编辑

提取

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2010-11-24 10:12 |只看该作者
$file =~ /\(([^)]*)\)/; #提取 () 中的内容
$newfile = $1;

论坛徽章:
0
3 [报告]
发表于 2010-11-24 10:40 |只看该作者
回复 2# zhlong8


    thanks,请问我的那个哪里错了?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期: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未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2010-11-24 11:06 |只看该作者
回复  zhlong8


    thanks,请问我的那个哪里错了?
qizhi502 发表于 2010-11-24 10:40



$newfile=~ /M.{5}^-?\d+$/;#提取 () 中的内容
print "new=$newfile\n"; #打印出来就知道错在那...  

论坛徽章:
0
5 [报告]
发表于 2010-11-24 15:38 |只看该作者
回复 2# zhlong8


    按照你的方法试下
  1. #!/usr/bin/perl
  2. my $string = "B1109322(MI-P2-1)M13+_A02.seq";
  3. $string =~ /\(([^)]*)\)/;
  4. my $sub = $string;
  5. print "the extracted is $sub\n";
复制代码
结果:the extracted is B1109322(MI-P2-1)M13+_A02.seq
没有变,什么原因?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2010-11-24 15:44 |只看该作者
回复 5# qizhi502


    按我的你就应该是 my $sub = $1; 而不是 my $sub = $string

    去看下 perlretut 置顶里面有翻译过的

论坛徽章:
0
7 [报告]
发表于 2010-11-24 16:42 |只看该作者
本帖最后由 qizhi502 于 2010-11-24 16:49 编辑

回复 6# zhlong8

$1代表第一对小括号中的内容,针对字符串已实验成功,现在又出点问题:
在批量修改文件名时,提示
    can't rename D:/seq/B1109302(OI-P1-1)M13+_E01.seq to OI-P1-1: OI-P1-1 exists  at E:\perl\practice\rename.pl line 12.
但是文件夹里根本没有存在
并且看了http://bbs.chinaunix.net/thread-1820956-1-1.html里面的帖子,但如果将后面的warn提示改成
    warn "can't rename $file to $newfile: $newfile exists " if -e $newfile;
    rename $file, $newfile or warn "rename $file to $newfile failed!";
结果文件夹的文件都没了,有些纳闷
  1. #!/usr/bin/perl -w
  2. #rename lots size file name
  3. use strict;
  4. my $file;
  5. my $newfile;
  6. foreach $file(glob "D:/seq/*.seq")
  7. {
  8.         $file =~ /\(([^)]*)\)/; #提取 () 中的内容
  9.   $newfile = $1;
  10. if (-e $newfile)
  11.   {
  12. warn "can't rename $file to $newfile: $newfile exists ";
  13.   } elsif (rename $file, $newfile) {
  14.   } else {
  15. warn "rename $file to $newfile failed:$! ";
  16.   }
  17. }



  18. [code]#!/usr/bin/perl -w
  19. #rename lots size file name
  20. use strict;
  21. my $file;
  22. my $newfile;
  23. foreach $file(glob "D:/seq/*.seq")
  24. {
  25.         $file =~ /\(([^)]*)\)/; #提取 () 中的内容
  26.   $newfile = $1;
  27.   warn "can't rename $file to $newfile: $newfile exists" if -e $newfile;
  28.   rename $file, $newfile or warn "rename $file to $newfile failed!"
  29. }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
8 [报告]
发表于 2010-11-24 20:47 |只看该作者
本帖最后由 zhlong8 于 2010-11-24 20:53 编辑

回复 7# qizhi502


    非常抱歉,希望你有做备份 :)

    warn "can't rename $file to $newfile: $newfile exists" if -e $newfile; 这里应该直接开始下一轮循环,而不是仅仅警告继续rename
warn("can't rename $file to $newfile: $newfile exists"), next if -e $newfile;

    还有你的文件不是丢失了,应该是到当前目录了,因为 rename 第一个参数你用的是绝对地址,第二个参数是单纯的文件名,文件应该都到当前目录了。应该把捕获的 $1 由文件名改为绝对地址,而且上面的 -e 也是同样的原因仅仅检测是否在当前目录有文件名字是 $newfile 的

论坛徽章:
0
9 [报告]
发表于 2010-11-24 22:42 |只看该作者
回复 8# zhlong8


    确实是在当前目录下,针对您提到的应该把捕获的 $1 由文件名改为绝对地址,是用File::Copy模块在修改之后移动还是在文件名修改之前直接定义?如果直接定义,怎么定义

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2010-11-25 09:29 |只看该作者
回复 9# qizhi502


    有那么复杂吗,直接字符串连接加上不就行了 $newfile = 'D:/seq/' . $newfile;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP