标准输出tree
包含有关文件层次结构的信息。该工具包含执行此操作的选项,其中大小添加所有文件的大小并仅显示文件夹 ( tree --du -h
) 允许发现大目录。
我正在寻找同样的东西,但是要寻找文件数量来发现大树中包含数十万个文件的不太大目录的热点。
答案1
这似乎不可能,tree
但你可以这样做:
慢速版本
find . -type d -exec bash -c 'printf "%7d " '\
'$(find "$1" -mindepth 1 -maxdepth 1 -type f -not -type l -printf . | wc -m); '\
'printf "%s\n" "$1"' find {} \; 2>/dev/null |
awk '$1>1000'
打印文件编号(在本例中仅打印大于 1,000 的文件编号)和目录路径。
在我的 /etc 中执行(文件计数阈值为 50)输出如下:
175 .
70 ./sysconfig
98 ./apparmor.d/abstractions
84 ./gconf/gconf.xml.schemas
122 ./brltty/Text
76 ./sane.d
快速版
bu5hman的回答让我意识到我没有注意到这有多慢。
所以这是另一种方法的优化版本:
find . -type f -not -type l -printf '%h\n' 2>/dev/null |
awk -v th=50 '{ a[$0]++; }; '\
'END { PROCINFO["sorted_in"]="@unsorted"; for (key in a) if (a[key]<th) delete a[key];'\
' PROCINFO["sorted_in"]="@val_num_desc";for (key in a) printf "%7d %s\n",a[key],key }'
175 .
122 ./brltty/Text
98 ./apparmor.d/abstractions
84 ./gconf/gconf.xml.schemas
76 ./sane.d
70 ./sysconfig
awk
不仅可以进行过滤,还可以进行计数和排序。它可以按照正确的顺序执行此操作:计数、过滤、排序。而 sort、count、filer 是最差的。当然,这仅对巨大的目录号码很重要,而之间的区别
- 大量进程移动少量数据并且
- 少量或进程移动更多数据
即使 /etc 中有 400 多个目录并且子进程的页面缓存命中率(可能)为 100%,这仍然是非常了不起的。
答案2
原版
-type
您只需对您感兴趣的文件系统进行一次扫描,然后按包含的文件夹和计数进行聚合。
find . -type f ! -type l 2>/dev/null | sed "s|/[^/]*$||g" | sort | uniq -c | awk '$1>=1000'
使用/etc
基准@阈值 50
109 .
96 ./apparmor.d/abstractions
138 ./ca-certificates/extracted/cadir
64 ./fonts/conf.avail
81 ./sane.d
58 ./xdg
real 0m0.014s
user 0m0.015s
sys 0m0.018s
反间谍版
由于战争似乎已经爆发,我认为我应该优化自己的军械库,并且按照战时反间谍活动的最佳传统,我进行了%h\n
无耻的盗窃。
find . -type f ! -type l -printf '%h\n' 2>/dev/null |
awk '{dir[$1]++}
END{for (d in dir) if (dir[d] >=50) print dir[d], d}'|
sort -g
58 ./xdg
64 ./fonts/conf.avail
81 ./sane.d
96 ./apparmor.d/abstractions
109 .
138 ./ca-certificates/extracted/cadir
real 0m0.006s
user 0m0.005s
sys 0m0.005s
由于此操作的执行时间小于我对小目录的关键反弹,并且我的整个 (2TB) 文件系统在约 1.5 秒内处理,因此我认为打字开销对我来说是即兴的一句台词有利。
尽管我慷慨地尊重 Glorious @haukelaging 解决方案的惊人速度
;)
后脚本我的整个FS
莫伊
real 0m1.481s
user 0m0.975s
sys 0m0.805s
土井
real 0m1.586s
user 0m1.069s
sys 0m0.843s