我正在尝试计算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
答案 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