首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl Archive::Tar

Perl Archive::Tar
EN

Stack Overflow用户
提问于 2010-12-01 09:40:46
回答 1查看 1.4K关注 0票数 3

我想用File::Find归档所有的txt文件,删除源文件并删除空目录。

我很难用'$tar->rename( );‘来重命名这些文件,因为我想去掉它们的完整路径名,只使用父目录/*.txt,但是不管我怎么尝试,代码都只重命名一个文件。

我不知道在哪里执行'unlink‘函数是合适的。

谢谢。

代码语言:javascript
复制
use strict;
use warnings;
use Archive::Tar;
use File::Find;
use File::Basename;  

my $dir = "E:/";

my @files = ();

find(\&archive, $dir);      
sub archive {
    /\.txt$/ or return;
    my $fd = $File::Find::dir;
    my $fn = $File::Find::name; 
    my $folder = basename($fd);
    my $file = $_;

    push @files, $fn;

    my $tar = Archive::Tar->new();  
    $tar->add_files(@files);
    $tar->rename( $fn, $folder."\\".$file );
    $tar->write($fd.'.tar');

    unlink $fn; 
    finddepth(sub{rmdir},'.');
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-01 10:10:52

您使用的File::Find接口不正确。对于找到的每个文件,都会调用一次归档子文件。您最终会在每次调用时创建一个新的tar,向其中添加一个文件并将其写出。

更正:您最终尝试添加之前找到的所有文件,但除了最后一个文件外,您已经取消了所有文件的链接。

让我们分几步来做-首先根据目录找到所有的.txt文件并进行分类,然后将它们添加到相关的tar文件中,最后清理:

代码语言:javascript
复制
my $dir = "E:/";

my %txt_files = ();

find(\&classify, $dir);      
sub classify{
    /\.txt$/ or return;
    my $fd = $File::Find::dir;
    my $fn = $File::Find::name;

    push @{$txt_files{$fd}||=[]}, $fn;
}

foreach my $folder (keys %txt_dirs) {
    my @files = @{$txt_files{$folder}};
    my $foldername = basename($folder);

    my $tar = Archive::Tar->new();  
    $tar->add_files(@files);
    $tar->rename( $_, $foldername."/".basename($_))
        for @files;

    $tar->write($folder.'.tar');
}

# remove all the txt files we've found
unlink for map {@{$_}} values %txt_files;

# try to remove the directories that contained the txt files
eval {rmdir} for keys %txt_files;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4320489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档