我想用File::Find归档所有的txt文件,删除源文件并删除空目录。
我很难用'$tar->rename( );‘来重命名这些文件,因为我想去掉它们的完整路径名,只使用父目录/*.txt,但是不管我怎么尝试,代码都只重命名一个文件。
我不知道在哪里执行'unlink‘函数是合适的。
谢谢。
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},'.');
}发布于 2010-12-01 10:10:52
您使用的File::Find接口不正确。对于找到的每个文件,都会调用一次归档子文件。您最终会在每次调用时创建一个新的tar,向其中添加一个文件并将其写出。
更正:您最终尝试添加之前找到的所有文件,但除了最后一个文件外,您已经取消了所有文件的链接。
让我们分几步来做-首先根据目录找到所有的.txt文件并进行分类,然后将它们添加到相关的tar文件中,最后清理:
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;https://stackoverflow.com/questions/4320489
复制相似问题