gpt4 book ai didi

Perl 存档:: tar

转载 作者:行者123 更新时间:2023-12-05 00:58:04 24 4
gpt4 key购买 nike

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

我在使用“$tar->rename( );”重命名文件时遇到困难因为我想从它们的完整路径名中删除它们并仅使用父目录/*.txt,但无论我尝试什么代码都只重命名一个文件。
我不知道执行“取消链接”功能的合适位置。

谢谢。

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},'.');
}

最佳答案

您错误地使用了 File::Find 接口(interface)。 archive sub 在每个找到的文件上被调用一次。您最终会在每次调用时创建一个新的 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;

关于Perl 存档:: tar ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4320489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com