2010-04-16 59 views
10
opendir MYDIR, "$dir"; 
    my @FILES = readdir MYDIR; 
    closedir MYDIR; 

看來數組中前兩個條目的99.9%總是「。」和「..」。如果它不是真的,那麼後面的腳本邏輯會有問題。我遇到了目錄條目稍後出現的情況。這是指示文件系統是否損壞或其他?是否有opendir返回的已知命令?Perl的opendir總是返回。和..第一?

回答

21

它始終是操作系統訂單,呈現未分類的原始數據。

雖然。和..往往是前兩項,這是因爲它們是前兩項創建的。如果由於某種原因,其中一個被刪除(通過非自然序列,因爲它通常被阻止),下一個fsck(或等效)將修復該目錄再次具有。這將在列表中稍後的地方放置其中一個名稱。

因此,不要只是「跳過前兩個條目」。相反,明確地匹配它們以拒絕它們。

+0

他們究竟如何被刪除?你能描述一個不自然的序列嗎? – ojblass 2010-04-16 15:48:48

+2

我認爲他意味着有些事情必須出錯,因爲它通常是被阻止的。如果fsck修復它,那意味着腐敗對我來說。我可以想象一個例子,可能發生的情況是父目錄被刪除或丟失的地方,而其內容不是(損壞或失敗的操作)。如果它是在fsck中恢復的,那會導致後面在其子目錄中放置「..」,我想象一下。 – kbenson 2010-04-16 16:07:31

+0

有些文件系統不將目錄條目存儲在有序列表中,並且在正常操作下不會在任何特定位置返回'.'和'..'。例如,啓用了B-trees的ext3/ext4,用於最新的ish Linux安裝。 – Gilles 2010-09-12 21:01:30

8

訂單由操作系統決定,並且沒有明確定義。

它們很容易過濾掉。

opendir MYDIR, "$dir"; 
    my @FILES = grep !/^\.\.?$/, readdir MYDIR ; 
    closedir MYDIR; 
+4

我會改變你的正則表達式來改善可用性:'my @FILES = grep!/^[。] {1,2} $ /,readdir MYDIR;' – DVK 2010-04-16 16:54:32

+3

@DVK我真的很喜歡'^ [。] [。 ]?\ z',但那時我很奇怪。只要確保你使用'\ z'而不是'$'來錨定字符串的末尾。 – 2010-04-16 17:33:01

+5

是的......請注意'/^\.\.?$/'也與「.. \ n」匹配,這是您合法的名稱,您不希望跳過。 – 2010-04-17 00:40:00

相關問題