如何在不使用find或-type的情况下递归计算unix目录中每种类型文件的数量?

时间:2014-03-06 19:39:19

标签: bash unix scripting

我正在尝试计算unix中目录中包含的常规文件,子目录,符号链接,块特殊文件和字符特殊文件的数量,但每次尝试时都会得到不一致的结果。我一直得到正常文件的结果,但从来没有相同的数字,也没有其他人保持不变。我已经附上了我正在尝试使用的脚本。可以在检查正确输入的错误消息中看到脚本的正确用法。

userinput=$1
#makes sure that there is only one input
if [ $# -ne 1 ];
then
        echo "Usage: dircount.sh directory" 1>&2
        exit 0
fi
#makes sure the file is a readable directory
if [ ! -d "$userinput" ] || [ ! -r "$userinput" ];
then
        echo "Please enter a directory you can read" 1>&2
        exit 0
else
        #prints the current directory
        cd $userinput
        pwd
        regfiles=0
        numsubs=0
        numsymb=0
        numblock=0
        numspecial=0
        for file in `ls -l $*`
        do
                if [ -f "$file" ];
                then
                        regfiles=`expr 1 + $regfiles`
                fi
                if [ -d "$file" ];
                then
                        numsubs=`expr 1 + $numsubs`
                fi
                if [ -L "$file" ];
                then
                        numsymb=`expr 1 + $numsymb`
                fi
                if [ -b "$file" ];
                then
                        numblock=`expr 1 + $numblock`
                fi
                if [ -c "$file" ];
                then
                        numspecial=`expr 1 + $numspecial`
                fi
        done

2 个答案:

答案 0 :(得分:2)

Don't parse ls。使用bash的递归globbing

shopt -s globstar nullglob
for file in **; do ...

我会使用关联数组来保存计数

declare -A num
for file in **; do 
    [[ -f $file ]] && (( num["reg"]++ ))

答案 1 :(得分:0)

像下一个可以工作(需要bash4)。

declare -A SUMTYPES
while read -r type
do
    let SUMTYPES["$type"]++
done < <(stat -c "%F" *)   #this is for gnu version of "stat"

for i in "${!SUMTYPES[@]}"
do
    echo "${SUMTYPES[$i]}   $i"
done

产生例如下一个输出

1   regular empty file
5   directory
1   symbolic link
9   regular file
1   fifo