免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: systemalgorithm
打印 上一主题 下一主题

写一个perl解压缩的程序能彻底解压一个.tar.gz文件【附上程序代码】 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2007-09-29 17:48 |显示全部楼层
原帖由 systemalgorithm 于 2007-9-29 16:10 发表
程序要求是:
unzip.pl   input.tar.gz


input.tar.gz 文件里还有a.tar.gz;b.tar.gz文件; a.tar.gz文件里还有.tar, .jar文件。

这个程序的目的就是要把input.tar.gz文件里的所有可以解压的tar/jar/tar. ...




典型的递归.


写了个, 测试下来暂时OK
use strict;
use warnings;

############# Main Begin ################

if ($ARGV[0]) {
    &deep_unzip($ARGV[0]);
}
else {
    print "Usage: DeepUnzip.pl 'file1' 'file2' 'filen'\n";
}

############# Main End ##################


### unzip the target recursively
sub deep_unzip {
    my $target = shift;
   
    if ($target =~ /\.jar$/i) {
        print "jar -xf $target\n";
        system("jar -xf $target");
        $target =~ s/\.jar$//i;
    }
    elsif ($target =~ /\.tar$/i) {
        print "tar -xf $target\n";
        system("tar -xf $target");
        $target =~ s/\.tar$//i;
    }
    elsif ($target =~ /\.tar\.gz$/i) {
        print "gunzip -f $target\n";
        system("gunzip -f $target");
        $target =~ s/\.gz$//i;
        
        print "tar -xf $target\n";
        system("tar -xf $target");
        $target =~ s/\.tar$//i;
    }
   
    # unzip the new files recursively
    if (-d $target) {
        print "cd $target\n";
        chdir($target);
        my @new_files = glob "*";
        foreach (@new_files) {
            &deep_unzip($_);
        }
        print "cd ..\n";
        chdir('..');
    }
}


[ 本帖最后由 Lonki 于 2007-10-13 18:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-30 22:08 |显示全部楼层
原帖由 systemalgorithm 于 2007-9-29 16:10 发表
程序要求是:
unzip.pl   input.tar.gz


input.tar.gz 文件里还有a.tar.gz;b.tar.gz文件; a.tar.gz文件里还有.tar, .jar文件。

这个程序的目的就是要把input.tar.gz文件里的所有可以解压的tar/jar/tar. ...



写了个, 测试下来暂时OK
use strict;
use warnings;

############# Main Begin ################

if ($ARGV[0]) {
    &deep_unzip($ARGV[0]);
}
else {
    print "Usage: DeepUnzip.pl 'file1' 'file2' 'filen'\n";
}

############# Main End ##################


### unzip the target recursively
sub deep_unzip {
    my $target = shift;
   
    if ($target =~ /\.jar$/i) {
        print "jar -xf $target\n";
        system("jar -xf $target");
        $target =~ s/\.jar$//i;
    }
    elsif ($target =~ /\.tar$/i) {
        print "tar -xf $target\n";
        system("tar -xf $target");
        $target =~ s/\.tar$//i;
    }
    elsif ($target =~ /\.tar\.gz$/i) {
        print "gunzip -f $target\n";
        system("gunzip -f $target");
        $target =~ s/\.gz$//i;
        
        print "tar -xf $target\n";
        system("tar -xf $target");
        $target =~ s/\.tar$//i;
    }
   
    # unzip the new files recursively
    if (-d $target) {
        print "cd $target\n";
        chdir($target);
        my @new_files = glob "*";
        foreach (@new_files) {
            &deep_unzip($_);
        }
        print "cd ..\n";
        chdir('..');
    }
}


如果一定需要is_ar和is_tar_gz的话, 这样就可以了:
### Check if it is .jar .tar
sub is_ar {
    $_[0] =~ /\.[jt]ar$/i;
}

### Check if it is .tar.gz
sub is_tar_gz {
    $_[0] =~ /\.tar\.gz$/i;
}


[ 本帖最后由 Lonki 于 2007-10-13 18:04 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-10-13 18:06 |显示全部楼层
To 楼上:
能否给个简单的exception?
目前测下来Ok的...

论坛徽章:
0
4 [报告]
发表于 2007-10-14 17:03 |显示全部楼层
原帖由 systemalgorithm 于 2007-10-14 15:07 发表
弄个测试文件就行了啊?
文件夹下a下有:
b.tar.gz
c.tar.gz
d.tar.gz
e.tar
f.jar
g.txt
hd/ccc.txt
hd/ddd.txt

tar cf a.tar a/
gzip a.tar

然后用程序解压a.tar.gz试试



测下来OK的.. 我是说你之前遇到的exception的test case

论坛徽章:
0
5 [报告]
发表于 2007-10-24 12:15 |显示全部楼层
写起来基本上一样.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP