2016-06-08 10 views
0

현재 디렉토리에서 90 일 이상 된 모든 파일을 삭제하려고합니다. 내가 생각할 수있는 유일한 해결책은 필자가 생각하는 것보다 더 많은 일이다. 이 작업을 수행하는 빠르고 쉬운 방법이 있습니까? 이 코드를 사용하여 작업하는 경우Perl에서 90 일 이상 파일 삭제

my $date=POSIX::strftime('%b%Y', localtime); 
my $logDir = "/test/dir/" 
my $dateDir = "$logDir/$date 
#this directory contains files with the form of someName.date 
+0

http://stackoverflow.com/q/17978927/936986 –

답변

1

전체 경로 정보를 유지하므로 여기 File::Find::Rule을 사용하는 방법입니다. 비교를위한 중요한 부분은 -M $file > 90입니다. -M은 파일이 마지막으로 수정 된 이후의 일 수를 반환합니다.

use warnings; 
use strict; 

use File::Find::Rule; 

my $dir = '.'; 
my $days = 90; 

my @files = File::Find::Rule->file() 
          ->maxdepth(1) 
          ->in($dir); 

for my $file (@files){ 
    if (-M $file > 90){ 
     print "deleting $file\n"; 
     unlink $file or warn $!; 
    } 
} 

maxdepth() 메서드는 "하위 디렉터리로 이동하지 마십시오"라는 메시지가 표시됩니다. 하위 디렉토리를보고 싶으면 0으로 설정하십시오.

또한 특정 이름을 지정하려는 경우 name() 메서드를 추가 할 수 있습니다.이 메서드는 정규식을 사용하고 해당 파일에서만 작동합니다. 예 : name('*.2016*')

+1

이것은 정확히 내가 찾고있는 것입니다. 감사 – cvirus96

1

을 당신은 -M 파일 테스트와 일에있는 파일의 나이를 얻을 수 있습니다. -X

-M 스크립트 시작 시간에서 파일 수정 시간 (일)을 뺀 값입니다.

나머지는 파일 목록을 가져 오는 것입니다. 여기서는 opendirreaddir을 사용합니다. readdir 어떤 경로없이 베어 파일 이름을 반환하기 때문에

use 5.012; # so readdir assigns to $_ in a lone while test 
opendir(my $dh, $dateDir) or die "Can't open $dateDir directory: $!"; 
while (readdir($dh)) { 
    my $file = "dateDir/$_"; 
    if (-f $file and -M $file > 90) { 
     unlink $file or warn "Can't unlink $file: $!"; 
    } 
} 

는 경로 또한 위 필요합니다. 실제로 삭제하기 전에 다양한 테스트를 포함 할 수 있습니다. (그리고 항상 테스트 코드가. 첫번째하시기 바랍니다) 버전의

이전 5.12있는 Perl 베어 readdiruse 5.012 위에 대해 무엇 인 $_를 설정하지 않았다. 이 버전의 경우 우리는 (너무 크지 않은 경우) 우리는 오히려

먼저 모든 파일의 목록을 원하는 경우 우리는 한 줄에 디렉토리를 읽을 수

opendir(my $dh, $dateDir) or die "Can't open $dateDir directory: $!"; 
while (my $file_nopath = readdir($dh)) { 
    my $file = "$dateDir/$file_nopath"; 
    # same as above 
} 

을 할 필요가

my @filenames_relative = readdir($dh); 
무엇 readdir 반환하는 것은 그것에서라고 컨텍스트를 기반으로하기 때문에 그 출력은 여기에 배열에 할당되어 있기 때문에., 그래서 그것이 리스트 문맥에서 호출되어,이 디렉토리에있는 모든 항목의 목록을 반환 .

파일 이름이 디렉토리를 기준으로하기 때문에 그 기능은 입력으로 목록을 필요로하기 때문에 우리가, 전체 경로 여기 리스트 문맥map에 의해 readdir에 부과

my @files = map { "$dateDir/$_" } readdir($dh); 

로를 map 수 있습니다.

+0

'$ file'은'$ dateDir'에있는 파일의 이름이 될 것이지만 현재 디렉토리에있는 것처럼 취급하고 있습니다. 작업. 경로를 함께 결합하거나'glob' 만 사용하십시오. – hobbs

+0

@hobbs 오, 감사합니다. 수정 – zdim

1

정확하게 이해하면 디렉토리 /test/dir에서 90 일이 지난 모든 파일을 삭제하고 싶습니다.나는 my $dateDir = "$logDir/$date가 무엇인지 이해하지 않지만,이 한 줄 솔루션을 사용하면 펄에서 파일의 나이를 찾기 위해

$ perl -e 'unlink grep { -f and -M >= 90 } glob "/test/dir/*"' 
0

을 여기 내 함수의 요청으로 수행합니다

########################################################################### 
# In: complete path to filename. 
# Out: age in fractional days 
sub getfileage 
{my($fn)[email protected]_; 
my(@a,@b,$i,$j,$procname,$s,$t); 

$procname="util2.pl:getfileage"; 

if (! -e $fn) 
    { 
    print "$procname ERROR: $fn does not exist\n"; 
    exit 1; 
    } 

my $age = -M $fn; # Returns age in days 
$age=sprintf("%.2f",$age); 

return $age; # getfileage 
} 

것은 그냥 플러그를 in, 그리고 파일 이름을 전달하십시오. 이 질문에 비틀 거리는 다른 사용자에게 유용 할 수도 있습니다.

관련 문제