我导出了一些文件,导出后实际上有2个文件丢失。 在报告中写道,我导出了260个文件,但我只有258个。
现在我想检查哪个文件丢失了。因此我决定使用Perl脚本尝试它,即使对我来说也是新手。
出口协议看起来像这样......
DATEDATEDATE - USER EXPORT,counter&00; 0000000001':对象: ' FILENAME'出口了。 DATEDATEDATE- USER EXPORT。 文件:' D:\ Work \ Export_Import \ Export \ FILENAME.xml'出口。
唯一重要的事情是文件名:]
谢谢!
编辑:解决了它。向下滚动:]
答案 0 :(得分:0)
问题的根源是这一行:
$Expo = $Export . $_;
您将所有文件名连接成一个单独的标量,但它不能很好地工作。因为您只有最后一个... ...特别是如果$Export
是一个目录,那么您尝试将其作为文件打开。
我可以建议使用File::Find
吗?有点像这样:
#!C:\Strawberry\perl\bin\perl.exe
#Pragmas
use strict;
use warnings;
my %files_in_dir;
my %files_in_export;
my $dir_name = '/path/to/dir';
my $export_name = 'filename_here';
sub find_files {
if (-f) {
$files_in_dir{$_} = $File::Find::name;
}
}
find( \&find_files, $dir_name );
#Open Export File
open( my $datei, "<", "$export_name" ) or die $!;
while ( my $filename = <$datei> ) {
chomp($filename);
if ( $files_in_dir{$filename} ) {
print "$filename in $files_in_dir{$filename}\n";
}
else {
print "No $filename found\n";
}
}
close($datei);
我还建议:
答案 1 :(得分:0)
创建成功导出文件的哈希索引(假设所有文件都在一个目录中,并且完整路径并不重要):
my $dir = 'some/dir';
opendir my $dh, $dir;
my @files = readdir $dh;
my %index;
$index{$_} = 1 foreach @files;
现在迭代“协议”文件并捕获每行上的导出文件名。使用该文件名来查看它是否作为您之前创建的哈希中的键存在。
# open your protocol file, then...
while (<$protocol_fh>) {
my $exported = $1 if $_ =~ /([^\/]+\.xml)/;
print "$exported was not found in $dir\n" if ! $index{$exported};
}
请注意,您必须测试该正则表达式以从协议文件中捕获文件名,因为我还没有对其进行测试。
答案 2 :(得分:0)
#Pragmas
use strict;
use warnings;
#Variablen
my $dir_name ='PathToDir';
my $export_name ='File.txt';
my $re1 = '.*?';
my $re2 = '((?:[a-z][a-z\\.\\d_]+)\\.(?:[a-z\\d]{3}))(?![\\w\\.])';
my @array1;
my @array2;
my $fqdn1;
my @diff;
my @isect;
my $item;
my %count;
#Open Report
open( my $fh, '<', $export_name )
or die "Could not open file '$export_name' $!";
while ( my $row = <$fh> ) {
chomp $row;
my $re = $re1 . $re2;
if ( $row =~ m/$re/is ) {
$fqdn1 = $1;
if ( $fqdn1 =~ m/xml/ ) {
push( @array1, $fqdn1 );
}
}
}
close($fh);
#Open Directory
opendir DIR, $dir_name;
@array2 = grep !/^\.\.?$/, readdir(DIR);
close(DIR);
#Searching the difference
@isect = ();
@diff = ();
%count = ();
foreach $item ( @array1, @array2 ) { $count{$item}++; }
foreach $item ( keys %count ) {
if ( $count{$item} == 2 ) {
push @isect, $item;
}
else {
push @diff, $item;
}
}
#Output
print "Missing Filenames = @diff\n\n";
# print "\nA Array = @array1\n";
# print "\nB Array = @array2\n";
# print "\nIntersect Array = @isect\n";
我解决了。谢谢大家。