免费注册 查看新帖 |

Chinaunix

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

前段时间写了一个改文件名后缀的程序,请仙子帮忙改进。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-10 09:54 |只看该作者 |倒序浏览
  1. #!/usr/bin/perl -w
  2. # SCRIPT: ren_sp.pl
  3. # AUTHOR: Ray001
  4. # DATE: 2010/04/21
  5. # REV: 1.00
  6. # For Study
  7. #
  8. # PURPOSE:
  9. # 将001...999后缀的文件重命名为后缀hx1...hx999

  10. use strict;

  11. if ( @ARGV < 1 ) {
  12.     die "Usage: ren_sp.pl basename\n";
  13. }

  14. # 读取当前目录下所有文件名
  15. opendir( my $curdir, "." );
  16. my @files = readdir($curdir);
  17. closedir($curdir);

  18. # 循环处理每个文件
  19. foreach my $file (@files) {

  20.     # 检索文件名前缀匹配输入参数,后缀匹配3位数字的文件
  21.     if ( $file =~ /($ARGV[0].*)(\d\d\d)$/ ) {
  22.         my $surfix   = $2;
  23.         my $file_new = $1 . "hx" . &kill_head_zero($surfix);
  24.         print "rename $file to $file_new\n";
  25.         rename( $file, $file_new );
  26.     }
  27. }

  28. # 将001...999转换为1...999
  29. sub kill_head_zero {
  30.     if ( @_ != 1 ) {
  31.         print "WARNING! &convert_to_hx need exactly one arguments!\n";
  32.     }
  33.     1 while $_[0] =~ s/^0(.*)/$1/;
  34.     $_[0];
  35. }
复制代码
我总觉得应该有更简洁的方法-。-;;

论坛徽章:
0
2 [报告]
发表于 2010-05-10 10:38 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-05-10 10:41 编辑

  1. #!/bin/env perl

  2. use strict;
  3. use warnings;

  4. foreach my $file (glob("*.*"))
  5. {
  6.         if ($file =~ /(.+)(\.\d{3})$/)
  7.         {
  8.                 my ($prefix, $endfix) = ($1, $2);
  9.                 if ($endfix =~ s/0*([1-9]\d*)/hx$1/)
  10.                 {
  11.                         rename($file, $prefix . $endfix);
  12.                 }
  13.         }
  14. }
复制代码
试试。。。。。。。。

论坛徽章:
0
3 [报告]
发表于 2010-05-10 10:38 |只看该作者
  1. foreach(glob "*.[0-9][0-9][0-9]"){$a=$_;s/(.*\.)(\d\d\d)/${1}.hx.int($2)/e;rename($a,$_) ;}
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-05-10 11:00 |只看该作者
{:3_186:}前面忘记写perl -e 啦

论坛徽章:
0
5 [报告]
发表于 2010-05-10 13:35 |只看该作者
学习

论坛徽章:
0
6 [报告]
发表于 2010-05-12 11:09 |只看该作者
回复 3# toniz

多谢各位指点,1.10版本出炉!
  1. #!/usr/bin/perl -w
  2. # SCRIPT: ren_sp.pl
  3. # AUTHOR: Ray001
  4. # DATE: 2010/04/21
  5. # REV: 1.10
  6. # For Study
  7. #
  8. # PURPOSE:
  9. # 将001...999后缀的文件重命名为后缀hx1...hx999

  10. use strict;

  11. if ( @ARGV < 1 ) {
  12.     die "Usage: ren_sp.pl prefix \n";
  13. }

  14. # 检索文件名前缀匹配输入参数,后缀匹配3位数字的文件
  15. foreach (glob("$ARGV[0]*.[0-9][0-9][0-9]")) {
  16.         my $file=$_;
  17.         s/(.*\.)(\d\d\d)/${1} . 'hx' . int($2)/e;
  18.         print " rename $file to $_ \n";
  19.         rename( $file, $_ );
  20. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-05-12 12:50 |只看该作者
这是我的实现
for (glob("$ARGV[0].[0-9][0-9][0-9]")) {
    my $newfile = $_;
    s/(?<=\.)0+(?=[1-9]\d*$)/hx/;
    rename( $newfile, $_ );
}

论坛徽章:
0
8 [报告]
发表于 2010-05-12 12:53 |只看该作者
for (glob("$ARGV[0].[0-9][0-9][0-9]")) {
    my $newfile = $_;
    s/(?<=\.)0*(?=[1-9]\d*$)/hx/;
    rename( $newfile, $_ );
}
上次那个+改成*

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
9 [报告]
发表于 2010-05-12 13:06 |只看该作者
map {/(.+?)\.([0-9]{3})/;print $1.".和谐".$2,"\n"} glob "XXXXX.[0-9][0-9][0-9]"

一行的比较好玩,再"perl"一点

论坛徽章:
0
10 [报告]
发表于 2010-05-13 15:11 |只看该作者
勉強になりました
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP