计算包含隐藏在bash中的所有文件和文件夹

时间:2014-01-22 20:30:11

标签: linux bash shell terminal

我有一个类似

的程序(功能)
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。

3 个答案:

答案 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 ./.[!.]*

>