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}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦它通过一个文件夹,它会在迭代另一个文件夹之前将计数设置为零。总共,我在不同的文件夹中有 30 个文件,计数最终为 6,即它遍历的最后一个文件夹中的文件数。有关如何解决此问题的任何提示?
if [ -d "$d" ]; then
(recursiveprint "$d")
fi
Run Code Online (Sandbox Code Playgroud)
该行周围的括号(recursiveprint "$d")
在子 shell 中运行该函数。当 subshell 启动时,FILES_COUNT
会克隆的值,并且在 subshell 内的递归调用中所做的更改不会在周围环境中生效。
如果没有子shell,它应该可以更好地工作,但是当从函数实例返回时,您需要手动返回到父目录。cd ..
会在函数内进行调用,但让我们使用一个变量,这样我们就可以返回原始工作目录,即使它是作为绝对路径给出的。
recursiveprint() {
local oldpwd=$PWD
cd "$1"
...
if [ -d "$d" ]; then
recursiveprint "$d" # no parenthesis here
fi
...
cd "$oldpwd"
}
Run Code Online (Sandbox Code Playgroud)
另请注意,*
默认情况下不匹配以点开头的文件名shopt -s dotglob
,如果需要,请使用。
归档时间: |
|
查看次数: |
93 次 |
最近记录: |