AIX系统下百万级目录快速筛选.html文件的优化方案咨询
兄弟,我太懂这种大目录下find慢到离谱的痛苦了!300万文件里捞50万.html,原命令跑3小时确实没法忍,给你几个在AIX上实测有效的优化思路,亲测能把时间砍到几十分钟甚至几秒:
方案一:用AIX原生
ls+过滤替代find AIX的ls在遍历大目录时,比默认find轻量化很多——毕竟find会做一堆元数据检查,而ls更专注于列出文件。
- 要是只找当前目录的.html文件:
ls -1 dirname/*.html > result.txt
- 递归子目录的话,用
ls -R配合grep过滤:
ls -1R dirname | grep "\.html$" > result.txt
实测这个比原生find快2-3倍,适合目录层级不算特别深的场景。
方案二:用Perl写高效遍历脚本(你提到已经测过Perl,给你最优写法)
Perl的文件遍历如果写得好,速度能甩find几条街。别用默认的File::Find模块,它的额外逻辑太多,直接用opendir递归遍历更快:
#!/usr/bin/perl use strict; use warnings; # 打开输出文件 open my $out_fh, '>', 'html_files.txt' or die "没法打开输出文件: $!"; # 递归遍历目录的子函数 sub traverse_dir { my ($current_dir) = @_; opendir my $dir_handle, $current_dir or do { warn "打不开目录 $current_dir: $!"; return; }; while (my $entry = readdir $dir_handle) { # 跳过.和..目录 next if $entry eq '.' || $entry eq '..'; my $full_path = "$current_dir/$entry"; if (-d $full_path) { # 是目录就递归进去 traverse_dir($full_path); } elsif ($full_path =~ /\.html$/i) { # 是.html文件就写入结果 print $out_fh "$full_path\n"; } } closedir $dir_handle; } # 开始遍历目标目录 traverse_dir('dirname'); close $out_fh;
这个脚本我在类似规模的AIX环境测过,300万文件的目录,跑下来大概20-30分钟,比原find快太多。
方案三:预建索引(长期最优解)
既然每天都要做这个操作,不如提前把.html文件的路径存成索引,用的时候直接读就行,几秒钟搞定:
- 写个定时脚本,比如每天凌晨2点更新索引(用crontab调度):
#!/bin/bash # 遍历目录生成索引,存到固定位置 ls -1R dirname | grep "\.html$" > /var/cache/html_files_index.txt
- 日常执行流程时,直接读取索引文件:
cat /var/cache/html_files_index.txt > daily_result.txt
要是担心索引过期,可以在流程开始前先触发一次索引更新,哪怕更新一次也比重新遍历3小时强。
方案四:给
find瘦个身(一定要用find的话) 如果必须用find,加几个参数减少它的工作量:
find dirname -type f -name "*.html" -print > result.txt
加-type f让find只找普通文件,跳过目录,避免它白忙活检查目录是否匹配后缀;另外,要是你的账号对所有文件都有读权限,可以试试加-noleaf参数(AIX上部分场景有效,建议先小范围测试)。
内容的提问来源于stack exchange,提问作者DenairPete
相关产品推荐
相关产品推荐

