2014-10-18 4 views
-3

:디렉토리의 모든 파일을 삭제하지만 디렉토리는 유지 하시겠습니까? 가장 쉬운 방법에 무엇

  • 가 주어진 디렉토리/파일/축에있는 모든 파일을 삭제가 (unlink)
  • 이 30 일 밖에
  • 보다 오래된 파일이 빈 디렉토리가 남아 있어야한다 (하지 rmdir을)
+0

참조 기존 게시물 : http://stackoverflow.com/questions/25090951/perl-delete-all-files- in-a-directory 및이 요지 : https://gist.github.com/johnhaitas/1507529 –

+0

해결책을 작성한 후, * 및 주어진 디렉토리 아래에있는 모든 파일을 검사하려고 할 수도 있습니다. 그게 맞습니까? – Borodin

답변

1

쉬운 방법은 'not perl'입니다.

find /files/axis -mtime +30 -type f -exec rm {} \; 
2

이렇게하면됩니다. 디렉토리를 나열하는 데 opendir/readdir을 사용합니다. stat은 필요한 모든 정보를 가져온 후 -f _-M _ 호출은 항목이 파일이고 stat 호출을 반복하지 않고 30 일 이상 경과했는지 확인합니다.


당신은 내가 생각하기 시작으로, 파일을 어디서나 아래에 주어진 디렉토리를 삭제하려면

use strict; 
use warnings; 
use 5.010; 
use autodie; 
no autodie 'unlink'; 

use File::Spec::Functions 'catfile'; 

use constant ROOT => '/path/to/root/directory'; 

STDOUT->autoflush; 

opendir my ($dh), ROOT; 

while (readdir $dh) { 
    my $fullname = catfile(ROOT, $_); 
    stat $fullname; 

    if (-f _ and -M _ > 30) { 
    unlink $fullname or warn qq<Unable to delete "$fullname": $!\n>; 
    } 
} 

는, 당신은 File::Find이 필요합니다. 전반적인 구조는 원래 코드와 크게 다르지 않습니다.

use strict; 
use warnings; 
use 5.010; 
use autodie; 
no autodie 'unlink'; 

use File::Spec::Functions qw/ canonpath catfile /; 
use File::Find; 

use constant ROOT => 'E:\Perl\source'; 

STDOUT->autoflush; 

find(\&wanted, ROOT); 

sub wanted { 
    my $fullname = canonpath($File::Find::name); 
    stat $fullname; 

    if (-f _ and -M _ < 3) { 
    unlink $fullname or warn qq<Unable to delete "$fullname": $!\n>; 
    } 
} 
0

크로스 플랫폼 호환 Perl 솔루션의 경우 다음 두 모듈 중 하나를 권장합니다.

  1. Path::Class

    #!/usr/bin/env perl 
    use strict; 
    use warnings; 
    
    use Path::Class; 
    
    my $dir = dir('/Users/miller/devel'); 
    
    for my $child ($dir->children) { 
        next if $child->is_dir || (time - $child->stat->mtime) < 60 * 60 * 24 * 30; 
        # unlink $child or die "Can't unlink $child: $!" 
        print $child, "\n"; 
    } 
    
  2. Path::Iterator::Rule

    #!/usr/bin/env perl 
    use strict; 
    use warnings; 
    
    use Path::Iterator::Rule; 
    
    my $dir = '/foo/bar'; 
    
    my @matches = Path::Iterator::Rule->new 
                ->file 
                ->mtime('<' . (time - 60 * 60 * 24 * 30)) 
                ->max_depth(1) 
                ->all($dir); 
    
    print "$_\n" for @matches;