我正在使用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上运行。
有人能指出我正确的方向吗?
答案 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;
}