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

相关问题