本贴对三种遍历文件夹方法比较。
1. 使用File::Find;
2. 递归遍历。(遍历函数为lsr)
3. 使用队列或栈遍历。(遍历函数为lsr_s)
1.use File::Find
#!/usr/bin/perl -W
#
# File: find.pl
# Author:路小佳
# License: GPL-2
use strict;
use warnings;
use File::Find;
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process {
my $file = $File::Find::name;
#print $file, "/n";
if (-d $file) {
$dircnt++;
}
else {
$filecnt++;
$size += -s $file;
}
}
find(/&process, '.');
print "$filecnt files, $dircnt directory. $size bytes./n";
2. lsr递归遍历
#!/usr/bin/perl -W
#
# File: lsr.pl
# Author: 路小佳
# License: GPL-2
use strict;
use warnings;
sub lsr($) {
sub lsr;
my $cwd = shift;
local *DH;
if (!opendir(DH, $cwd)) {
warn "Cannot opendir $cwd: $! $^E";
return undef;
}
foreach (readdir(DH)) {
if ($_ eq '.' || $_ eq '..') {
next;
}
my $file = $cwd.'/'.$_;
if (!-l $file && -d _) {
$file .= '/';
lsr($file);
}
process($file, $cwd);
}
closedir(DH);
}
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process($$) {
my $file = shift;
#print $file, "/n";
if (substr($file, length($file)-1, 1) eq '/') {
$dircnt++;
}
else {
$filecnt++;
$size += -s $file;
}
}
lsr('.');
print "$filecnt files, $dircnt directory. $size bytes./n";
3. lsr_s栈遍历
#!/usr/bin/perl -W
#
# File: lsr_s.pl
# Author: 路小佳
# License: GPL-2
use strict;
use warnings;
sub lsr_s($) {
my $cwd = shift;
my @dirs = ($cwd.'/');
my ($dir, $file);
while ($dir = pop(@dirs)) {
local *DH;
if (!opendir(DH, $dir)) {
warn "Cannot opendir $dir: $! $^E";
next;
}
foreach (readdir(DH)) {
if ($_ eq '.' || $_ eq '..') {
next;
}
$file = $dir.$_;
if (!-l $file && -d _) {
$file .= '/';
push(@dirs, $file);
}
process($file, $dir);
}
closedir(DH);
}
}
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process($$) {
my $file = shift;
print $file, "/n";
if (substr($file, length($file)-1, 1) eq '/') {
$dircnt++;
}
else {
$filecnt++;
$size += -s $file;
}
}
lsr_s('.');
print "$filecnt files, $dircnt directory. $size bytes./n";
对我的硬盘/dev/hda6的测试结果。
1: File::Find
26881 files, 1603 directory. 9052479946 bytes.
real 0m9.140s
user 0m3.124s
sys 0m5.811s
2: lsr
26881 files, 1603 directory. 9052479946 bytes.
real 0m8.266s
user 0m2.686s
sys 0m5.405s
3: lsr_s
26881 files, 1603 directory. 9052479946 bytes.
real 0m6.532s
user 0m2.124s
sys 0m3.952s
测试时考虑到cache所以要多测几次取平均, 也不要同时打印文件名, 因为控制台是慢设备, 会形成瓶颈。
lsr_s之所以用栈而不是队列来遍历,是因为Perl的push shift pop操作是基于数组的, push pop这样成对操作可能有优化。内存和cpu占用大小顺序也是1>2>3.
CPU load memory
use File::Find 97% 4540K
lsr 95% 3760K
lsr_s 95% 3590K
结论: 强烈推荐使用lsr_s来遍历文件夹。
=============再罗嗦几句======================
从执行效率上来看,find.pl比lsr.pl的差距主要在user上, 原因是File::Find模块选项较多, 条件判断费时较多,而lsr_s.pl比lsr.pl在作系统调用用时较少, 是因为递归时程序还在保存原有的文件句柄和函数恢复现场的信息, 所以sys费时较多。 所以lsr_s在sys与user上同时胜出是不无道理的。
分享到:
相关推荐
HTC DHD微信文件夹下,voice文件夹下有巨多子文件夹,小弟想提取出微信语音文件。
载入目录路径并且搜索所有目录下任意文件类型,linux下过滤掉以"."和".."的文件,即UNIX下的隐藏文件
主要介绍了Perl脚本实现递归遍历目录下的文件,本文直接给出实现代码,代码中包含明细注释,需要的朋友可以参考下
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 15.5 ...
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 15.5 ...
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 ...
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 ...
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 15.5 ...
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 15.5 ...
15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 15.5 ...
针对后门设计存在的缺陷,结合/proe文件系统特点,提出了一种接顺序遍历所有PID目录而找出全部进程的方法。再将结果与普通的进程查找输出作对比,可以发现隐藏的进程。最后给出采用Perl语言实现此查找功能的流程图...
文件遍历 文件上传 XML注入 JSON注入 命令注入 LDAP注入 PHP Python Node.js 去 ASP经典版 :check_mark: :check_mark: ASP.NET :check_mark: Java JavaScript Ruby Ruby Perl HTML HTML5 VB脚本 ...
Perl包装脚本(reBar.pl)以及使用ZBar(一种用于读取各种来源条形码的软件包)根据图像文件中可见的一维条形码重命名一批自然历史标本图像文件的安装和使用说明。 执行 reBar.pl 将遍历目录中的 JPEG 文件,使用 ...
对于难以打印的值也是如此:$ pl'e“ $ {q} Perl $ q”,“ $ Q @ A $ Q”“一个衬里$ pl'e \” Perl“,\ @A,undef'一个循环遍历args,打印每个带有行尾的行。 同样,喊:$ pl -opl” Perl一个衬里$ pl -opl'...
递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...
如果找到该文件,它将从文件的开头开始遍历zip记录。 遇到任何格式不正确的zip数据结构都可能终止程序。 如果程序发现zip文件存在任何结构性问题,它将在输出报告的末尾打印摘要。 所报告的错误案例集正在处理中,...
在这两种情况下,文件在从源到目的地的过程中都必须遍历许多组件,在这些组件中,性能优化和失败都有很多机会。 存在许多用于提供可靠和/或高性能文件传输功能的工具,但是大多数工具不支持本地传输,需要特定的...
获得alexa cnn.com网站的Alexa.com排名所有-遍历文件列表的命令all 'tar -zxvf FILE' *tgz 安娜- appkey-将击键或快捷键发送到特定应用程序或全局发送,以通过编程方式控制它们arduino- asm-通过nasm编译,链接和...