免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8220 | 回复: 11
打印 上一主题 下一主题

求教探索File::Find模块的深度使用,如过滤文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-01 18:30 |只看该作者 |倒序浏览
perl中有个模块,File::Find,搜索目录,文件用的。平时很好用。最近突然思考了一个问题,始终理解不透彻。希望大牛帮忙解析:

代码目的:
       假设目录文件量非常大,想提高扫描效率。
工作目标:
       有的目录明确知道不需要扫描。我该如何才能排除他们。不是简单的不打印出结果,而是实实在在的不去read这个目录?

我看了下这个模块,暂时看到 两种方法的可能性,我试验了第一种,失败了。。。不知道我哪里理解错了?
顺带第二种我也没信心了,请大家帮忙看看我的代码有什么问题,有什么处理的好方法。

代码:
use 5.010;
use File::Find;

$path=`cd`;
chomp $path;
$option{wanted}=\&want;
$option{untaint}=1;
$option{untaint_skip}=1;
$option{untaint_pattern}=qr\web2$\;            #这个匹配,到底是符合规则的才处理,还是符合规则的不处理,应该怎么写?这个参数我
                                                                   #无论怎么改都没有起到作用,比如我目录下有个子目录web2,照样打印出来了,包括web2的子目录和文件。。。。why。。。
find(\%option,$path);
sub want{
        say $File::Find::name;
}

第二个方法,是prepross,这个我只在网上看了有人提到,具体方法和效果也不太理解?
请大牛们帮忙救救。。。。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
2 [报告]
发表于 2013-10-01 22:00 |只看该作者
next if -d $name ;

论坛徽章:
0
3 [报告]
发表于 2013-10-01 22:02 |只看该作者
回复 2# wenhq


    在什么参数下,什么位置写呢?
    我想要的不只是打印结果,而是实实在在的,不去扫描某子目录下的文件。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
4 [报告]
发表于 2013-10-01 22:04 |只看该作者
看下perl 进阶 第7章 :File::Find

论坛徽章:
0
5 [报告]
发表于 2013-10-01 22:44 |只看该作者
回复 4# wenhq


    是intermediate perl吗?我搜了没有untaint_pattern等关键字啊?能提供更详细的信息吗,谢谢啦。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
6 [报告]
发表于 2013-10-02 08:11 来自手机 |只看该作者
是讲这个模块的呀!

论坛徽章:
0
7 [报告]
发表于 2013-10-02 12:10 |只看该作者
回复 6# wenhq


    因为是英文的,我大概扫了下,外加搜索了下我使用的关键参数。是有将,但是好像没有我的代码中的相关参数?

论坛徽章:
0
8 [报告]
发表于 2013-10-02 21:13 |只看该作者
自己再顶一下。。。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2013-10-03 20:43 |只看该作者
这个模块不好用,初学者建议使用  File::Find::Wanted   中提供的简单接口。 find_wanted
  1. To get a list of all files ending in .jpg:

  2.     my @files = find_wanted( sub { -f && /\.jpg$/ }, $dir );
  3. For a list of all directories that are not CVS or .svn:

  4.     my @files = find_wanted( sub { -d && !/^(CVS|\.svn)$/ }, $dir ) );
  5. It's easy, direct, and simple.

  6. WHY DO THIS? ^

  7. The cynical may say "that's just the same as doing this":

  8.     my @files;
  9.     find( sub { push @files, $File::Find::name if -f && /\.jpg$/ }, $dir );
复制代码

论坛徽章:
1
天蝎座
日期:2013-11-25 10:40:37
10 [报告]
发表于 2013-10-08 01:14 |只看该作者
use 5.010;
use File::Find;

sub want{
        say $File::Find::name;
}

$File::Find::skip_pattern = qr/$File::Find::skip_pattern | web2/x; #可以修改skip_pattern,注意加上它的默认值。
find(\&want, '.');
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP