/var分区inode使用完的解决过程之二找出包含文件数最多的目录

一:首先要看的一种方法是上篇博客中的一种,具体可以参见http://askubuntu.com/questions/316027/find-directories-with-lots-of-files-in,代码如下:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

echo "Wait a moment if you want a good top of the bushy folders..."

find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do
    echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'

exit 0

简单的解释下原理:

1. find "$@" -type d -print0 2>/dev/null 找出传过来的目录下所有的文件夹
2. while IFS= read -r -d '' file 每次读取一个文件夹
3. do echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file";done 统计每一个文件夹下的文件数
4. sort -nr | head | awk '{print NR".", "\t", $0}' 按照文件数排序输出前十个

具体的跟shell相关的小知识可以参考这几篇文章:

http://c.biancheng.net/cpp/view/2739.html

http://stackoverflow.com/questions/26479562/what-does-ifs-do-in-this-bash-loop-cat-file-while-ifs-read-r-line-do

http://unix.stackexchange.com/questions/26784/understanding-ifs

作为上面的精简版你同时可以使用

for i in `find /var -type d `; do echo `ls -a $i | wc -l` $i; done | sort -nr|head

二:上面的帖子中还有一种方法find /var -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr | head -n25,这种方法的思路是先找出/var下所有的目录,然后再使用find '{}' -type f找出这些子目录下所有的文件,可以想象的到跟方法一比,速度有多慢,不建议用,如下:

[root@admin02 peiqiang]# time find /var -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr | head -n25
24999   /var
10908   /var/spool
10822   /var/spool/clientmqueue
9218    /var/lib
8765    /var/lib/yum
8723    /var/lib/yum/yumdb
4371    /var/cfengine
3773    /var/cfengine/inputs
3721    /var/cfengine/inputs/files
3606    /var/cfengine/inputs/files/userkeys
1396    /var/lib/yum/yumdb/l
929     /var/lib/yum/yumdb/p
905     /var/lib/yum/yumdb/h
593     /var/lib/yum/yumdb/m
565     /var/cfengine/outputs
537     /var/lib/yum/yumdb/c
499     /var/lib/yum/yumdb/s
351     /var/lib/php/session
351     /var/lib/php
344     /var/lib/yum/yumdb/i
339     /var/lib/yum/yumdb/n
337     /var/lib/yum/yumdb/d
314     /var/lib/yum/yumdb/g
314     /var/lib/yum/yumdb/b
312     /var/lib/yum/yumdb/k

real    0m5.172s
user    0m1.466s
sys     0m2.093s
[root@admin02 peiqiang]# time find /var -type d -print0 2>/dev/null | while IFS= read -r -d $'\0' file; do echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file" ;done | sort -nr | head | awk '{print NR".", "\t", $0}'
1.       10822 files in:         /var/spool/clientmqueue
2.       3606 files in:  /var/cfengine/inputs/files/userkeys
3.       566 files in:   /var/cfengine/outputs
4.       351 files in:   /var/lib/php/session
5.       174 files in:   /var/lib/yum/yumdb/l
6.       158 files in:   /var/www/icons
7.       114 files in:   /var/lib/yum/yumdb/p
8.       113 files in:   /var/lib/yum/yumdb/h
9.       74 files in:    /var/lib/yum/yumdb/m
10.      67 files in:    /var/lib/yum/yumdb/c

real    0m3.020s
user    0m0.629s
sys     0m1.462s
[root@admin02 peiqiang]#

还有一中方法类似二find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n,找出所有文件只保留目录名,然后排序输出,同样不建议用,具体可参见http://stackoverflow.com/questions/347620/where-are-all-my-inodes-being-used

另外一种可以看做上面一种的变种,使用了awk,find /var -type f |awk '{$NF="";a[$0]++}END{for (i in a) print a[i],i }' FS=\/ OFS=\/ |sort -rn|head ,参见http://www.unix.com/shell-programming-and-scripting/170874-directory-has-most-files.html