2009-09-02 4 views
2

많은 하위 폴더가있는 Client라는 폴더가 있습니다. 각 하위 폴더를보고 거기에 폴더가 있는지 확인하기 위해 Perl 스크립트를 만들고 싶습니다. 거기에 있다면, 나는 그것을 건너 뛰고 싶다. 거기에 없다면, 나는 그것을 만들고 처리하기를 원한다.Perl에서 하위 하위 디렉토리를 확인하려면 어떻게합니까?

어떻게 모든 하위 폴더를 반복하고 원하는 디렉토리를 확인합니까? 폴더 및/또는 하위 폴더의 모든 파일을 가져 오는 방법에 대한 많은 정보를 찾았지만 각 하위 폴더 내의 디렉터리를 확인하는 데는 아무 것도 발견하지 못했습니다.

답변

12

Augh! 다른 답변은 너무 복잡합니다. 원래의 질문은 재귀 적 순회를 요구하는 것으로 보이지 않습니다. 최대한 멀리 볼 수, 이것은 완벽하게 합리적인 해결책이며, 부팅에 훨씬 더 읽기 :

진심
foreach my $dir (glob "Client/*") { 
    next if ! -d $dir;    # skip if it's not a directory 
    next if -d "$dir/subfolder"; # skip if subfolder already exists 
    mkdir "$dir/subfolder" or die; # create it 
    do_some_processing();   # do some processing 
} 

사람 :했던 opendir/readdir은? 정말?

+0

사람들이 모듈 바이러스를 얻고 프로그램하는 법을 잊어 버립니다. 적어도 나는 이것을 보는 유일한 사람이 아니다. :) –

+0

아멘! +1 KISS 솔루션 :) – DVK

+0

하지만, 나는 "$를 사용하지 않기 때문에 downvote 유혹이야!" mkdir의 오류 메시지에서 :) – DVK

2
#!/usr/bin/perl 

use strict; 

use Fcntl qw(:DEFAULT :flock :seek); 
use File::Spec; 
use IO::Handle; 

my $startdir = shift @ARGV || '.'; 
die "$startdir is not a directory\n" 
    unless -d $startdir; 
my $verify_dir_name = 'MyDir'; 

my $dh = new IO::Handle; 
opendir $dh, $startdir or 
    die "Cannot open $startdir: $!\n"; 
while(defined(my $cont = readdir($dh))) { 
    next 
     if $cont eq '.' || $cont eq '..'; 
    my $fullpath = File::Spec->catfile($dir, $cont); 
    next 
     unless -d $fullpath && -r $fullpath && -w $fullpath; 
    my $verify_path = File::Spec->catfile($fullpath, $verify_dir_name); 
    next 
     if -d $verify_path; 
    mkdir($verify_path, 0755); 
    # do whatever other operations you want to $verify_path 
} 
closedir($dh); 
+1

누군가가 IO :: Handle을 사용하는 것을 잊었습니다. –

+0

참으로. 더 나은 지금. :) – chaos

0

짧은 대답은 File :: Flnd입니다.

긴 대답은 먼저 폴더의 존재를 확인하는 서브 루틴을 작성한 다음 폴더가없는 경우 작성하고 필요한 처리를 수행합니다. 그런 다음 File :: Find 모듈의 find 메소드를 호출하여 서브 루틴에 대한 참조와 시작 폴더를 참조하여 모든 서브 폴더를 처리하십시오.

+0

그런 간단한 작업을 위해 많은 작업이 필요합니다. :) –

4

단계로 나누면 꽤 쉽습니다. glob로 서브 디렉토리 목록을 얻은 다음 두 번째 레벨 디렉토리가없는 서브 디렉토리를보십시오. File :: Find-like 모듈을 사용한다면 너무 많은 작업을 수행하고있을 것입니다.

관련 문제