我有一个名为Lib我正在使用 File::Find 模块在整个目录中搜索该文件夹,D:\
。搜索需要很长时间,如果驱动器有很多子目录,甚至需要 5 分钟。我怎样才能更快地搜索该库,以便在几秒钟内完成?
我的代码如下所示:
find( \&Lib_files, $dir);
sub Lib_files
{
return unless -d;
if ($_=~m/^([L|l]ib(.*))/)
{
print"$_";
}
return;
}
在没有预先存在的索引的情况下搜索文件系统是 IO 绑定的。否则,产品范围包括locate http://unixhelp.ed.ac.uk/CGI/man-cgi?locate+1 to Windows 桌面搜索 http://www.microsoft.com/windows/products/winfamily/desktopsearch/default.mspx不会存在。
Type D:\> dir /b/s > directory.lst
并观察该命令运行需要多长时间。您不应该期望在不首先索引文件的情况下击败它。
您可以做出的一项重大改进是减少打印频率。一个小的改进是,如果您不打算捕获,则不要使用捕获括号:
my @dirs;
sub Lib_files {
return unless -d $File::Find::name;
if ( /^[Ll]ib/ ) {
push @dirs, $File::Find::name;
}
return;
}
在我的系统上,一个简单的脚本使用File::Find
与以下命令相比,打印我的主目录下包含大约 150,000 个文件的所有子目录的名称需要几分钟的时间dir %HOME% /ad/b/s > dir.lst
大约 20 秒内完成。
我会倾向于使用:
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ }
split /\n/, `dir %HOME% /ad/b/s`;
在我的系统上,不到 15 秒就完成了。
如果有机会的话还有其他的dir.exe
in %PATH%
, cmd.exe
是内置的dir
不会被调用。您可以使用qx! cmd.exe /c dir %HOME% /ad/b/s !
以确保正确dir
被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)