为什么我收到 IO::Uncompress::Unzip::unzip: input filename is undef or null string 消息?
Why i am getting IO::Uncompress::Unzip::unzip: input filename is undef or null string message?
我有一个包含许多 zip 文件的文件夹。我需要获取这些 zip 文件中的任何一个,将其解压缩并从压缩文件中获取特定文件。为此,我正在使用 IO::Uncompress::Unzip 模块。
我的 perl 脚本如下:
#!usr/bin/perl
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use strict;
my $propath ="/home/test/prroot/Projects/";
my $proj = "/home/Ras/projectroot/projects.txt";
my @projlist = `cat $proj`;
foreach my $pr(@projlist){
chomp($pr);
my $projname = $pr;
my $projtemp = $pr;
$projname =~ s/ /\_/g;
my $replace1 = "%28"; #escaping special characters from project name
my $replace2 = "%29";
my $replace3 = "%26";
my $replace4 = "%2C";
$projname =~ tr/ /_/;
$projname =~ s/\(/$replace1/g;
$projname =~ s/\)/$replace2/g;
$projname =~ s/\&/$replace3/g;
$projname =~ s/\,/$replace4/g;
chomp($projname);
my $dir = $propath.$projname;
chomp($dir);
my @res = glob "$dir/*.zip";
my @res1 = split '/',$res[$#res];
my $out = chdir $dir;
my $input = "$res1[$#res1]";
my $output = "/home/Ras/projectroot/xmlres/result$projname.xml";
my $status = unzip $input => $output, Name => "data";
}
文件/home/Ras/projectroot/projects.txt包含了100多个项目名称。对于每个项目名称,路径 /home/test/prroot/Projects/ 下都有一个文件夹。在 projectname 文件夹中有 zip 文件。我需要从 zip 文件中读取名为 data 的特定文件。我能够将 13 个文件的输出读取为 /home/Ras/projectroot/xmlres/result$projname.xml。但在那之后没有结果。请帮我解决这个问题。
'因为我不知道你的数据是什么样子的,所以我在这里提供了一个稍微改进的脚本版本(添加了错误处理)。
#!usr/bin/perl
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use File::Find;
use strict;use warnings;
my $propath ="/home/test/prroot/Projects/";
my $proj = "/home/Ras/projectroot/projects.txt";
my $output_dir = "/home/Ras/projectroot/xmlres/";
my @projlist = `cat $proj`;
my $projname;
foreach my $pr (@projlist){
chomp($pr);
$projname = $pr;
$projname =~ s/ /\_/g;
$projname =~ tr/ /_/;
$projname =~ s/\(/%28/g;
$projname =~ s/\)/%29/g;
$projname =~ s/\&/%26/g;
$projname =~ s/\,/%2C/g;
print "$dir\n";
find({ wanted => \&find_zip}, $dir);
}
sub find_zip {
my $filename = $File::Find::name;
print "$filename\n";
if ($filename =~ /zip$/ ) {
unless( unzip $filename => $output_dir.'result'.$projname.'.xml', Name => "data" ) {
warn "$filename: $UnzipError";
}
}
}
首先要检查的是脚本正在尝试解压缩您期望的所有文件。
然后查看解压缩是否有问题。
试试这个
print "About to unzip '$input' to '$output'\n" ;
my $status = unzip $input => $output, Name => "data"
or die "unzip from '$input' to '$output' failed: $UnzipError\n";
解压缩时出现数据错误。我对脚本进行了修改,这很有帮助。
my $status = `unzip -p $input "data" > $output`
通过添加以上行替换 unzip $input => $output, Name => "data" 有助于解决问题。
无需解压缩zip文件,仅读取数据内容即可满足要求。感谢您的帮助
我有一个包含许多 zip 文件的文件夹。我需要获取这些 zip 文件中的任何一个,将其解压缩并从压缩文件中获取特定文件。为此,我正在使用 IO::Uncompress::Unzip 模块。 我的 perl 脚本如下:
#!usr/bin/perl
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use strict;
my $propath ="/home/test/prroot/Projects/";
my $proj = "/home/Ras/projectroot/projects.txt";
my @projlist = `cat $proj`;
foreach my $pr(@projlist){
chomp($pr);
my $projname = $pr;
my $projtemp = $pr;
$projname =~ s/ /\_/g;
my $replace1 = "%28"; #escaping special characters from project name
my $replace2 = "%29";
my $replace3 = "%26";
my $replace4 = "%2C";
$projname =~ tr/ /_/;
$projname =~ s/\(/$replace1/g;
$projname =~ s/\)/$replace2/g;
$projname =~ s/\&/$replace3/g;
$projname =~ s/\,/$replace4/g;
chomp($projname);
my $dir = $propath.$projname;
chomp($dir);
my @res = glob "$dir/*.zip";
my @res1 = split '/',$res[$#res];
my $out = chdir $dir;
my $input = "$res1[$#res1]";
my $output = "/home/Ras/projectroot/xmlres/result$projname.xml";
my $status = unzip $input => $output, Name => "data";
}
文件/home/Ras/projectroot/projects.txt包含了100多个项目名称。对于每个项目名称,路径 /home/test/prroot/Projects/ 下都有一个文件夹。在 projectname 文件夹中有 zip 文件。我需要从 zip 文件中读取名为 data 的特定文件。我能够将 13 个文件的输出读取为 /home/Ras/projectroot/xmlres/result$projname.xml。但在那之后没有结果。请帮我解决这个问题。
'因为我不知道你的数据是什么样子的,所以我在这里提供了一个稍微改进的脚本版本(添加了错误处理)。
#!usr/bin/perl
use IO::Uncompress::Unzip qw(unzip $UnzipError);
use File::Find;
use strict;use warnings;
my $propath ="/home/test/prroot/Projects/";
my $proj = "/home/Ras/projectroot/projects.txt";
my $output_dir = "/home/Ras/projectroot/xmlres/";
my @projlist = `cat $proj`;
my $projname;
foreach my $pr (@projlist){
chomp($pr);
$projname = $pr;
$projname =~ s/ /\_/g;
$projname =~ tr/ /_/;
$projname =~ s/\(/%28/g;
$projname =~ s/\)/%29/g;
$projname =~ s/\&/%26/g;
$projname =~ s/\,/%2C/g;
print "$dir\n";
find({ wanted => \&find_zip}, $dir);
}
sub find_zip {
my $filename = $File::Find::name;
print "$filename\n";
if ($filename =~ /zip$/ ) {
unless( unzip $filename => $output_dir.'result'.$projname.'.xml', Name => "data" ) {
warn "$filename: $UnzipError";
}
}
}
首先要检查的是脚本正在尝试解压缩您期望的所有文件。
然后查看解压缩是否有问题。
试试这个
print "About to unzip '$input' to '$output'\n" ;
my $status = unzip $input => $output, Name => "data"
or die "unzip from '$input' to '$output' failed: $UnzipError\n";
解压缩时出现数据错误。我对脚本进行了修改,这很有帮助。
my $status = `unzip -p $input "data" > $output`
通过添加以上行替换 unzip $input => $output, Name => "data" 有助于解决问题。 无需解压缩zip文件,仅读取数据内容即可满足要求。感谢您的帮助