2012-03-07 5 views
6
opendir(DIR,"$pwd") or die "Cannot open $pwd\n"; 
    my @files = readdir(DIR); 
    closedir(DIR); 
    foreach my $file (@files) { 
     next if ($file !~ /\.txt$/i); 
     my $mtime = (stat($file))[9]; 
     print $mtime; 
     print "\n"; 
    } 

기본적으로 디렉토리의 모든 txt 파일의 타임 스탬프를 기록합니다. 하위 디렉토리가있는 경우 해당 하위 디렉토리에도 파일을 포함하고 싶습니다.디렉토리의 모든 파일을 탐색하는 방법. 하위 디렉토리가있는 경우 하위 디렉토리의 파일을 탐색하려고합니다.

누군가 위의 코드를 수정하여 서브 디렉토리를 포함하도록 도와 줄 수 있습니까?

난 창에서 아래의 코드를 사용하고있는 경우에도 내 폴더 외부 폴더에있는 모든 파일의 점점 타임 스탬프를 IAM

당신은 재귀를 사용할 수 있습니다
my @dirs = ("C:\\Users\\peter\\Desktop\\folder"); 
    my %seen; 
    while (my $pwd = shift @dirs) { 
      opendir(DIR,"$pwd") or die "Cannot open $pwd\n"; 
      my @files = readdir(DIR); 
      closedir(DIR); 
      #print @files; 
      foreach my $file (@files) { 
        if (-d $file and !$seen{$file}) { 
          $seen{$file} = 1; 
          push @dirs, "$pwd/$file"; 
        } 
        next if ($file !~ /\.txt$/i); 
        my $mtime = (stat("$pwd\$file"))[9]; 
        print "$pwd $file $mtime"; 
        print "\n"; 
      } 
    } 

답변

8
use warnings; 
use strict; 

my @dirs = ("."); 
my %seen; 
while (my $pwd = shift @dirs) { 
     opendir(DIR,"$pwd") or die "Cannot open $pwd\n"; 
     my @files = readdir(DIR); 
     closedir(DIR); 
     foreach my $file (@files) { 
       if (-d $file and ($file !~ /^\.\.?$/) and !$seen{$file}) { 
         $seen{$file} = 1; 
         push @dirs, "$pwd/$file"; 
       } 
       next if ($file !~ /\.txt$/i); 
       my $mtime = (stat("$pwd/$file"))[9]; 
       print "$pwd $file $mtime"; 
       print "\n"; 
     } 
} 
+0

오래된 튼튼한 방법 ... 재귀없이 = 멋지게 완료 됨) – Ouki

+1

'$ file! ~ /^\.*$/'은'$ file = ~ /[^.]/'입니다. 그러나 나는 과거에 리눅스 파일의 유효한 이름이기 때문에 단지 3 개의 점 또는 그 이상의 이름을 제외하기 위해 심하게 비난을 받았다. 그래서 테스트 *는'$ file! ~ /^\.\.?$/' – Borodin

+0

@perreal이어야합니다. 파일을 열어서 파일 내의 특정 문자열을 검색하고 그러한 파일을 분리하려면, 그렇게 할 생각입니다. OPEN INPUT, $ file, $ lines = 을 입력 한 다음, 그것을 적용하십시오. 괜찮습니까? 또는 다른 쉬운 방법이 있습니다. – Peter

1

: 파일을 통해 이동하고 자체적으로 호출하는 함수를 정의 디렉토리. 그런 다음 최상위 디렉토리에서 함수를 호출하십시오.

도 참조하십시오. File::Find

+0

디렉토리 내의 파일과 디렉토리를 구별하는 방법 – Peter

+1

@Peter : [here] (http://perldoc.perl.org/functions/-html)에 설명 된'-d' 및'-f' 연산자를 사용하십시오. X.html) – Borodin

11

File::Find이 가장 적합합니다. 그것은 핵심 모듈이므로 설치할 필요가 없습니다. 이 코드는 당신이 마음 '.' 스캔 할 디렉토리 트리의 루트

use strict; 
use warnings; 

use File::Find; 

find(sub { 
    if (-f and /\.txt$/) { 
    my $mtime = (stat _)[9]; 
    print "$mtime\n"; 
    } 
}, '.'); 

에 갖고있는 것 같다 무엇에 해당합니까; 원한다면 여기 $pwd을 사용할 수 있습니다. 서브 루틴 내에서 Perl은 파일을 찾은 디렉토리에 chdir을 수행하고 $_은 파일 이름으로 설정하고 $File::Find::name은 경로를 포함하는 완전한 파일 이름으로 설정합니다.

+1

[모두가 당신과 동의하지 않을 것입니다] (https://www.socialtext.net/perl5/alternatives_to_file_find) 파일에서 : Find best. – salva

+1

File :: Find가 느리고 API가 실망 스럽지만, 이처럼 사소한 일에 이상적이라고 생각합니다. 나는 누군가가 그것에 반대하는 것을 듣고 싶다. – Borodin

+0

@salva 아주 오래된 댓글입니다.하지만 링크가 이제 로그인 페이지를 가리키고 있습니다. –

관련 문제