2011-07-05 47 views
2

我正在使用file::find來遍歷目錄結構並將其打印出來,但我在排除隱藏文件時遇到了問題。以下是我迄今爲止:使用File :: Find忽略隱藏文件

find(\&todo, $start_dir); 
sub todo 
{ 
    if ($_ =~ /^./) 
    { 
    print "hidden file $_\n"; 
    } 
    else 
    { 
    if (-f $_) #check for file 
    { 
     file; 
    } 
    elsif (-d $_) #check for directory 
    { 
     directory($File::Find::dir); 
    } 
    else 
    { 
     print "ERROR: $_\n"; 
    } 
    } 
}   

如果我刪除if ($_ =~ /^./)檢查,文件和目錄做工精細,但加入這個打印一切爲隱藏文件。正如你所看到的,我只需要這個在unix上工作。 任何人都可以指向正確的方向嗎?

編輯:我忘了在前面的一個反斜槓。 - 應該是if($ _ =〜/^./),但是find()有一個忽略隱藏文件/目錄的默認方式? 謝謝!

+0

這結束了工作: 如果((($ _ =〜/^\./)|| ($ File :: Find :: dir =〜m /[.]/))) –

回答

8

.在正則表達式中匹配任何字符;使用\.來匹配文字.。你可能應該learn about regexes

+0

謝謝。我一定會閱讀。我覺得Perl可能有更好的方法來使用find()忽略隱藏的文件,但是我沒有找到任何方法通過搜索...該功能不存在嗎? –

+0

'File :: Find'只是給你文件,它取決於你想要的功能。它不會嘗試處理除自動遞歸到目錄之外的其他任何內容。 – geekosaur

2

請參閱geekosaur以解釋您的問題。在簡單的情況就是這樣,substr可能比一個正則表達式較好的通話:

if(substr($_, 0, 1) eq '.') { 

正則表達式是一個很好的工具,但他們不應該在你的工具箱中的唯一的事情。

+0

謝謝,這完成了同樣的事情嗎?我現在的問題是,它仍然通過隱藏的目錄...有沒有辦法修改find​​()來忽略隱藏的文件/目錄? –

+0

@Ryan:它完成了與'if($ _ =〜/^\./)'同樣的事情。而且我認爲geekosaur正在將你排除在File :: Find之上,對嗎? –

1

/^./regular expression。這段時間意味着任何單個字符,所以你所說的是匹配任何以任何字符開頭的字符串,並且幾乎匹配所有文件名。

您需要在期間之前加上反斜線,或使用\Q和'\ E'。 \Q禁用匹配元字符這意味着它基本上消除了所有的魔法,並使所有的東西都成爲普通的字符串。在這種情況下,反斜線會更好,但你能想象試圖匹配一些更復雜,\Q\E會更好地工作:

任何一項都將工作:

if ($_ =~ /^\./) 
{ 
    print "hidden file $_\n"; 
} 


if ($_ =~ /^\Q.\E/) 
{ 
    print "hidden file $_\n"; 
} 
0

如果你在Windows上的perl模塊Win32::File會告訴你一個文件是否隱藏。 Win32 :: File默認安裝在ActivePerl中。

不幸的是,Win32 :: File沒有附帶任何示例,(我希望cpan爲PHP網站等每個頁面都添加了一條評論功能,當然還有Annocpan,但額外的點擊幾乎沒有任何貢獻),但這個線程將幫助http://www.perlmonks.org/?node_id=194011

還有面向Win32::File::Object了更好的對象,但除非你申請這個補丁:(只處理文件工作https://rt.cpan.org/Public/Bug/Display.html?id=60735

結果似乎不可思議,雖然因爲大量的文件你沒有除非被隱藏起來或系統變成兩者兼而有之。我最終放棄了,只是狠狠地抨擊了這一點礦石的某些文件夾:

if($_ =~ /(RECYCLER)|(System Volume Information)/) { 
    $File::Find::prune = 1; 
}