Hvordan arkiverer jeg .log filer med Perl på Windows XP?

Indlæg af Hanne Mølgaard Plasc

Problem



På så simpelt måde som muligt undrer jeg mig over, om nogen ved, hvordan man arkiverer .log filer i en Windows XP-mappe ved blot at navngive dem med den aktuelle 'localtime ()' som en del af filnavnet? ( Antag ikke, at der er en lås på logfilen. ) Jeg prøvede alle mulige forskellige måder at gøre dette på, men kunne ikke løse det ... og der findes ikke gode eksempler på internettet.


Her er hvad jeg leder efter:


for (all files > that 1 day old)   
  rename file  to  file.[datestamp].log
end

Bedste reference


Nå ser det så let ud, at jeg måske misforstår noget. Opgaven er at flytte for eksempel 'yada.log' til 'yada.2011-05-04.log'? Så hvad med det her:


use strict;
use warnings;

use File::Copy;
use POSIX qw(strftime);

my $dir = $ARGV[0] or die "Usage: $0 <directory>";
my $now\_string = strftime "\%Y-\%m-\%d\_\%H\%M\%S", localtime;

opendir DIR, $dir or die $!;
my @files = readdir DIR;

chdir $dir or die $!;
for my $file (@files) {
    next if (-d $file);
    next unless ($file =~ /^(.*)(.log)$/i);
    my $dst = $1 . "." . $now\_string . $2;
    move ($file, $dst) or die "Failed to move $file: $!";
}

Andre referencer 1


opendir(FILES, '*logdir*');
my @files = readdir FILES;
closedir(FILES);
foreach(@files){
    system "move $\_ $\_.".localtime().".log" if -A $\_ > *age*;
}

Andre referencer 2


Her er hvordan jeg i sidste ende gjorde det takket være TLP! Dette script er buggy på linje # 12, men det virker næsten ikke.


use strict; 
use warnings;
use File::Copy; 
use POSIX qw(strftime); 

my $dir;
my $file;

if ( @ARGV = 2 ) { 
  print "Two args accepted."; 
  $dir = $ARGV[0] or die "Usage: <directory> <filename>";
  $file = $ARGV[1] or die "Usage: <directory> <filename>";
  goto runblock; 
}
else { print "Number of arguments must be 2: directory filename
"; goto fail; }

runblock: print "Renaming $file .
";

chdir $dir or die $!;
my $now\_string = strftime "\%Y-\%m-\%d\_\%H\%M\%S", localtime; 
if (-e $file) {
  if (-A $file > 7 ) {
    my $dst = "siteAlive." . $now\_string . ".log"; 
    move($file, $dst) or die "Failed to move $file: $!";
    goto endscript;
  }
} 

fail: print "Failed to rename $file . Try again.
" ;
endscript: print "End of script.
";

Andre referencer 3


Måske er der nogle moduler, der kan gøre dette for dig, som f.eks. Logfile::Rotate. [6]