2012-07-25 5 views
1

Perl 스크립트에 디렉토리 세트가 있는지 확인해야합니다. 디렉토리 이름은 XXXX * YYY 형식입니다 - 각 XXXX를 확인하고 true 인 경우 if 문을 입력해야합니다.와일드 카드로 Perl에 디렉토리 존재 여부 확인

제 스크립트에는 $ monitor_location (스캔 할 루트 디렉토리에 대한 경로 포함)과 $ clientid (XXXX 포함)라는 두 개의 변수가 있습니다.

아래의 코드 스 니펫이 확장되어 내가하는 일 중 더 많은 것을 보여줍니다. 나는 각 클라이언트 ID를 반환하는 쿼리를 가지고 있으며, 반환 된 각 레코드에 대해 루핑을 수행하고 해당 클라이언트 ID가 사용하는 디스크 공간을 계산하려고합니다.

는 지금까지 (작동하지 않습니다) 다음 코드가 :

# loop for each client 
while (($clientid, $email, $name, $max_record) = $query_handle1->fetchrow_array()) 
{ 
    # add leading zeroes to client ID if needed 
    $clientid=sprintf"%04s",$clientid; 

    # scan file system to check how much recording space has been used 
    if (-d "$monitor_location/$clientid\*") { 
    # there are some call recordings for this client 
    $str = `du -c $monitor_location/$clientid* | tail -n 1 2>/dev/null`; 
    $str =~ /^(\d+)/; 
    $client_recspace = $1; 
    print "Client $clientid has used $client_recspace of $max_record\n"; 
    } 
} 

분명히하기 위해, 나는 XXXX로 시작하는 모든 폴더가있는 경우 if 문을 입력합니다.

희망적이라고 생각하세요! 감사합니다

답변

5

당신은 와일드 카드를 확장 glob를 사용할 수 있습니다

for my $dir (grep -d, glob "$monitor_location/$clientid*") { 
    ... 
} 
+0

나는 달성하고자하는 것을 더 잘 보여주기 위해 질문에서 코드를 편집했습니다. 위의 코드를 코드에 어떻게 적용 할 수 있는지를 고민하는 것은 약간의 의견을 고맙게 생각할 것입니다. 감사합니다 – btongeorge

+0

grep의 좋은 해결책과 좋은 사용법 – gaussblurinc

+0

@btongeorge : 만약 그 디렉토리가 존재 하는지를 알고 싶다면'if (grep -d, glob "$ ...")'를 사용할 수 있습니다. – choroba

1

나는 "일"글로브에 대한 있습니다. (그것은 단지 한 번만 (나를 위해) 사용하는 것으로 보인다. 나중에 같은 스크립트에서 다시 같은 디렉토리를 다시 볼 수 없다는 것을 의미한다.)

나는 readdir()을 선호한다. 이것은 확실히 길지만 WFM입니다.

chdir("$monitor_location") or die; 
open(DIR, ".") or die; 
my @items = grep(-d, grep(/^$clientid/, readdir(DIR))); 
close(DIR); 

@items의 모든 항목은 원하는 내용과 일치합니다.

+0

감사합니다. 그래서 이것을 원래 코드의 컨텍스트에두면 du 라인을 실행하여 @items의 각 ID에 대해 동일한 클라이언트 ID를 가진 모든 디렉토리의 결합 된 크기를 가져와야합니다. 어떻게하면 될까요? – btongeorge

+1

@jimtut :'glob'는 스칼라 컨텍스트에서 반복자를 만듭니다. 그것은 그것으로 당신의 실패의 근원일지도 모른다. – choroba

+0

'glob'는 대개 DWIM이지만 특이성과 직관력이 없습니다. 비 glob 솔루션을 염두에 두는 것이 좋습니다. – mob

관련 문제