遍历目录和文件夹时获取文件计数

遍历目录和文件夹时获取文件计数
recursiveprint() {
#FILES_COUNT=0

cd $1
  for d in *; do
    if [ -d "$d" ]; then
       (recursiveprint "$d")
    fi
    if [ -f "$d" ]; then
       file_name=$(basename "$d")
        ((FILES_COUNT++))
        clear
        echo  "$file_name"
        echo "total count = $FILES_COUNT"
    fi
    done
}
recursiveprint ${START_DIR}

问题是,一旦它遍历一个文件夹,它就会在遍历另一个文件夹之前将计数设置回零。总共,我在不同的文件夹中有 30 个文件,计数最终为 6,即它迭代的最后一个文件夹中的文件数。关于如何解决这个问题有什么建议吗?

答案1

if [ -d "$d" ]; then
   (recursiveprint "$d")
fi

该行周围的括号(recursiveprint "$d")在子 shell 中运行该函数。当子 shell 启动时, 的值FILES_COUNT被克隆,并且子 shell 内的递归调用中所做的更改不会在周围环境中生效。

如果没有子 shell,它应该可以更好地工作,但是当从函数实例返回时,您需要手动返回到父目录。cd ..可以用于函数内进行的调用,但让我们使用一个变量,这样我们就可以返回到原始工作目录,即使它是作为绝对路径给出的。

recursiveprint() {
    local oldpwd=$PWD
    cd "$1"
    ...
        if [ -d "$d" ]; then
           recursiveprint "$d"          # no parenthesis here
        fi
    ...
    cd "$oldpwd"
}

另请注意,*默认情况下不匹配以点开头的文件名,shopt -s dotglob如果需要,请使用 。

答案2

惯于

find /my/dir/ -type f | grep -c .

为你工作?

答案3

find .// -type f | grep -c '^\.//'

将可靠地计算所有文件(即使是那些名称中包含换行符的文件)。

相关内容