2017-10-20 40 views
-1

J'ai un programme qui va extraire un fichier zip appelé "output.zip" et en faire un répertoire. Je voudrais faire un fichier journal si un certain mot est dans l'un des fichiers que j'ai extraits dans ce cas, le mot est Erreur. L'erreur que je reçois dit que le fichier n'existe pas. Comment puis-je réparer cela?Comment faire un fichier journal de sortie du fichier zip que vous venez d'extraire

#!/usr/bin/perl 

use strict; 
use warnings; 

use Archive::Zip qw(:ERROR_CODES :CONSTANTS); 

my $sSource = "/home/glork/output.zip"; 
my $sDest = "/home/glork/zipped"; 



x_unzip($sSource,$sDest); 

sub x_unzip { 
my ($zip_file, $out_file, $filter) = @_; 
my $zip = Archive::Zip->new($zip_file); 
unless ($zip->extractTree($filter || '', $out_file) == AZ_OK) { 
    warn "unzip not successful: $!\n"; 
    } 
} 


open(LOGFILE, "/home/glork/zipped/var/log/*.log") or die "can't find file"; 

while(<LOGFILE>) { 
    print "Error in line $.\n" if(/ERROR/); 
} 
close LOGFILE; 
+1

N'essayez pas d'utiliser un caractère générique dans 'open'. Vous ne connaissez pas le nom du fichier? – toolic

+0

@toolic Ouais je connais les noms de fichiers mais, c'est un groupe de fichiers – Glorksnork

+0

Vous devrez ouvrir chaque fichier l'un après l'autre. Vous ne pouvez pas écrire dans plusieurs fichiers en même temps. Mais vous pouvez avoir un tableau de handles de fichiers lexicaux, et parcourir pour écrire à tous. – simbabque

Répondre

1

Quelque chose comme ça devrait fonctionner. Vous extrayez tous les fichiers, enregistrez les noms. Parcourez ensuite chaque fichier à la recherche d'erreurs:

use strict; 
use warnings; 

use Archive::Zip qw(:ERROR_CODES :CONSTANTS); 

my $sSource = "/home/glork/output.zip"; 
my $sDest = "/home/glork/zipped"; 

my @extractedFiles; 
my $zip = Archive::Zip->new($sSource); 
foreach my $member ($zip->members) { 
    next if $member->isDirectory; 
    (my $extractName = $member->fileName) =~ s{.*/}{}; 
    $member->extractToFileNamed($sDest.'/'.$extractName); 
    push @extractedFiles, $extractName; 
    print "Extracted $sDest/$extractName\n"; 
} 

foreach my $logFile (@extractedFiles) { 
    open(LOGFILE, "$sDest/$logFile") or die "can't find file"; 
    while(<LOGFILE>) { 
     print "Error in line $.\n" if(/ERROR/); 
    } 
    close LOGFILE; 
} 
+0

Cool cela fonctionne mais, est-il possible pour moi de mettre les résultats dans un fichier séparé – Glorksnork

+0

Il suffit d'ouvrir un fichier pour écrire et imprimer des erreurs dans ce fichier. – Andrey