这个脚本可以用来检查服务器上哪个目录发生了文件过量的情况,提前发现可能发生的超多文件目录的情况。主要使用的是find命令,先find所有的子目录,然后再用find找出所有文件,然后用wc来获取文件数量。脚本能够设定成邮件模式,加入crontab可以在指定时间执行,然后将运行结果邮件给指定的用户。还可以设定find的深度,避免目录层数过多而浪费时间。详细内容见代码。

#!/bin/bash
# By Chen.Zhidong
# http://sillydong.com
# Email:njutczd+gmail.com

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH

#Begin
usage(){
        echo -e "Check inode of path\nUsage: $0 [mail|local] [max_length] [path_to_check]"
        exit 0
}

check(){
        if [ -e $2 -a -d $2 ];then
                dirs=`find -P $2 -maxdepth $1 -type d | grep -xv $2 | grep -xv . | sort`
                for d in $dirs
                do
                        if [ -e $d -a -d $d ];then
                                c=$(find -P $d -type f | wc -l)
                                printf "%-70s- %s\n" $d $c
                        fi
                done
                printf "%-70s- $(find -P $2 -type f | wc -l)\n" "Total:"
        else
                echo "Fail to get file dir"
        fi
}

if [ $# -lt 2 ];then
        usage
else
        if [ $3 ];then
                dir=$3
        else
                dir=$(pwd)
        fi
        case $1 in
        "mail")
                TMPLOG=`mktemp`
                echo "`ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | head -n 1`" > $TMPLOG
                check $2 $dir >> $TMPLOG 2>&1
                mail -s "CHECKINODE INODE RESULT IN `date`" njutczd@gmail.com < $TMPLOG
                ;;
        "local")
                check $2 $dir
                ;;
        *)
                usage
                ;;
        esac
fi
exit $?
#End