2011-04-22 5 views
1

가능한 한 간단한 방법으로 누군가가 파일 이름의 일부로 현재 "localtime()"으로 이름을 지정하여 Windows XP 디렉터리에 .log 파일을 보관하는 방법을 알고 있다면 궁금합니다. (로그 파일에 자물쇠가 있다고 가정하지 마십시오.)이 작업을 수행하는 다양한 방법을 시도했지만 해결할 수 없었습니다 ... 웹에 좋은 예제가 없습니다. 여기Windows XP에서 Perl로 .log 파일을 보관하는 방법은 무엇입니까?

내가 무엇을 찾고 있습니다 :

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

[logrotate] (http://linux.die.net/man/8/logrotate)를 다시 만들거나 다시 구현해야 할 충분한 이유가 있습니까? – abbot

+2

왜 'logrotate'를 사용하지 않습니까? 보통 대부분의 리눅스 배포판에 제공되거나 패키지를 제공하지 않는 nix 시스템을 사용하는 경우 소스에서 컴파일 할 수 있습니다. – ewh

+1

에는 Windows XP에서 작동하는 logrotate 용 바이너리가 있습니까? – djangofan

답변

2

음이 너무 쉽게 보이는, 아마도 뭔가를 오해하고 있습니다. 예를 들어 "yada.log"를 "yada.2011-05-04.log"로 옮기는 작업은 무엇입니까?

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: $!"; 
} 
다음
+0

스크립트가 작동하지만 이미 보관 된 파일을 보관할 필요가 없습니다. 나는 나의 질문에서 그것을 말하지 않았다. 그러나 그것은 내가 의미했던 것이다. – djangofan

+0

예, 방금 전 생각했습니다 ..'next if ($ file = ~ /20\d{2}-\d{2}-\d{2}_\d{6}\.log$/나);'그것을해야한다 (오는 89 년 동안). 어쨌든이 날짜 기록으로 .. 나는 그것을 아주 예쁘게 만들지 못했고, 나는 두려웠습니다. – TLP

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

내가 궁극적으로 TLP 덕분에 그것을 어떻게입니다 : 다음 방법에 대해이! 이 스크립트는 12 번 라인에서 버그가 있지만 간신히 작동합니다.

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\n"; goto fail; } 

runblock: print "Renaming $file .\n"; 

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.\n" ; 
endscript: print "End of script.\n"; 
+0

'if (@ARGV = 2)'로 인해 미묘한 오류가 발생합니다. 원하는 것은'if (@ARGV == 2)'로 값을 검사하는 것이고, 그렇지 않으면 새로운 값을 할당합니다. – TLP

+0

몇 가지 사항을 변경했습니다. 원래 파일의 부분 이름을 유지하지 않고 (모두 siteAlive라고 함), 액세스 시간이 1 일이 아닌 7 일 이상인지 확인한 후 단일 파일로 실행합니다 파일 만. 의도적인지 확실하지 않습니다. 도움이 더 필요하면 알려주세요. – TLP

+0

감사합니다. 예. "일반적으로"답변을 원했지만 특정 풍경에서 배운 것을 사용하고 싶었습니다. – djangofan

0

아마도 예를 들어 Logfile::Rotate처럼, 당신을 위해 somehting을이 작업을 수행 할 수있는 몇 가지 모듈이 있습니다.