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 '^\.//'
将可靠地计算所有文件(即使是那些名称中包含换行符的文件)。