我有一个类似
的程序(功能)countf()
{
for f in "$1"/* "$1"/.[!.]*; do
if [ -d "$f" ];
then
folders=$(($folders + 1))
countf "$f"
else
files=$(($files + 1))
fi
done
}
当文件夹包含至少1个隐藏文件时,它会给出正确的值。但是,它假设“$ 1 /.[!.]*”作为文件,并在没有隐藏文件时对其进行计数。
这是我解决问题的方法
countf()
{
for f in "$1"/* "$1"/.[!.]*; do
if [ -d "$f" ];
then
folders=$(($folders + 1))
countf "$f"
else
# added if else
if [ "$f" != "$1/.[!.]*" ]; then files=$(($files + 1)); fi
fi
done
}
我不能使用find。
答案 0 :(得分:0)
计算文件:
find . -type f | wc -l
计算目录
find . -type d | wc -l
.
代表当前目录。如果查看其他目录,请使用适当的路径替换。
答案 1 :(得分:0)
如果没有隐藏文件,将按字面处理该模式,并且由于它不是目录,因此您认为它是一个文件。在递增文件计数之前,只需验证$f
是否为文件,就像检查它是否是目录一样。
countf()
{
for f in "$1"/* "$1"/.[!.]*; do
if [ -d "$f" ];
then
folders=$(($folders + 1))
countf "$f"
elif [ -f "$f" ]
then
files=$(($files + 1))
fi
done
}
答案 2 :(得分:0)
我相信你只需要设置nullglob
以避免计算这个glob模式:
shopt -s nullglob
TEST:在空目录中执行此操作:
> echo ./.[!.]*
./.[!.]*
> shopt -s nullglob
> echo ./.[!.]*
>