使用File :: Find忽略隐藏文件

时间:2011-07-05 18:02:12

标签: perl 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()是否有默认方式忽略隐藏文件/目录? 谢谢!

4 个答案:

答案 0 :(得分:8)

正则表达式中的

.匹配任何字符;使用\.来匹配文字.。你可能应该learn about regexes

答案 1 :(得分:2)

请参阅geekosaur以获取有关问题的解释。在这种简单的情况下,substr可能是一个比正则表达式更好的调用:

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

正则表达式是一个很棒的工具,但它们不应该是工具箱中唯一的东西。

答案 2 :(得分:1)

/^./regular expression。句点意味着任何单个字符,所以你所说的是匹配任何以任何字符开头的字符串,并且几乎匹配所有文件名。

您需要在句点之前加上反斜杠,或使用\Q和'\ E'。 \Q禁用元字符上的匹配,这意味着它基本上删除了所有魔法并使所有内容成为普通的字符串。在这种情况下,反斜杠会更好,但你可以设想尝试匹配更复杂的东西,\Q\E会更好用:

其中任何一个都可行:

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


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

答案 3 :(得分:1)

如果您在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;
}