2012-07-25 89 views
1

我需要檢查Perl腳本中是否存在任何一組目錄。這些目錄以XXXX * YYY格式命名 - 我需要檢查每個XXXX並輸入if語句(如果爲true)。用通配符檢查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 2012-07-26 09:03:34

+0

好的解決方案和良好的'grep'使用方法 – gaussblurinc 2012-07-26 09:12:17

+0

@btongeorge:如果你只是想知道這些目錄是否存在,你可以使用'if(grep -d,glob「$ ...」)''。 – choroba 2012-07-26 09:26:44

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線來獲取具有相同客戶端ID的所有目錄的組合大小,以便@items中的每個ID。我怎麼能這樣做呢? – btongeorge 2012-07-25 17:04:02

+1

@jimtut:'glob'在標量上下文中創建一個迭代器。這可能是你失敗的根源。 – choroba 2012-07-25 17:17:04

+0

'glob'通常是DWIM,但它有它的特質和不直觀的用途。記住非'glob'解決方案是很好的。 – mob 2012-07-26 17:06:32

相關問題