Chinaunix

标题: 求教探索File::Find模块的深度使用,如过滤文件 [打印本页]

作者: pigkingone    时间: 2013-10-01 18:30
标题: 求教探索File::Find模块的深度使用,如过滤文件
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,这个我只在网上看了有人提到,具体方法和效果也不太理解?
请大牛们帮忙救救。。。。
作者: wenhq    时间: 2013-10-01 22:00
next if -d $name ;
作者: pigkingone    时间: 2013-10-01 22:02
回复 2# wenhq


    在什么参数下,什么位置写呢?
    我想要的不只是打印结果,而是实实在在的,不去扫描某子目录下的文件。
作者: wenhq    时间: 2013-10-01 22:04
看下perl 进阶 第7章 :File::Find
作者: pigkingone    时间: 2013-10-01 22:44
回复 4# wenhq


    是intermediate perl吗?我搜了没有untaint_pattern等关键字啊?能提供更详细的信息吗,谢谢啦。
作者: wenhq    时间: 2013-10-02 08:11
是讲这个模块的呀!
作者: pigkingone    时间: 2013-10-02 12:10
回复 6# wenhq


    因为是英文的,我大概扫了下,外加搜索了下我使用的关键参数。是有将,但是好像没有我的代码中的相关参数?
作者: pigkingone    时间: 2013-10-02 21:13
自己再顶一下。。。
作者: 104359176    时间: 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 );
复制代码

作者: dqw233    时间: 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, '.');

作者: dqw233    时间: 2013-10-08 01:15
回复 1# pigkingone
  1. use 5.010;
  2. use File::Find;

  3. sub want{
  4.         say $File::Find::name;
  5. }
  6.                         
  7. $File::Find::skip_pattern = qr/$File::Find::skip_pattern | web2/x;
  8. find(\&want, '.');
复制代码

作者: pigkingone    时间: 2014-08-14 15:32
skip_pattern方法没有试过。
不过我发现prepross这个option参数设置一个回调函数。这个函数中过滤不需要的。retrun需要处理的目标的数组就可以了。
看上去这个应该是起作用了。分享之。
目录多的情况下,还是有意义的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2