我一直在寻找一种解决方案,可以递归列出每个子目录中的文件数量。有许多解决方案可以给出给定起始目录的每个子目录中的文件数量,但这些解决方案似乎只列出了起始目录的子目录数量,而不是递归地遍历所有子目录的树结构。
例如,
topdir1
sublevelA1 10 个文件
sublevelA2 200 files
sublevelA3 600 files
sublevelB1 50 个文件
sublevelB2 123 files
sublevelB3 357 files
我尝试过的解决方案只会给我两行内容,分别表示 sublevelA1 810 文件和 sublevelB1 530 文件。
我想要一个解决方案,可以给出上面的 6 行。不需要缩进。
答案1
你可以做这样的事情:
find path/to/topdir1/ -type d -exec sh -c '
d="$1"; set -- "$d"/*; printf "%s: %d files\n" "$d" "$#"
' sh {} \;
这将打印子目录的完整路径 - 如果您想要不合格的目录名称,请更改-exec
为-execdir
。它将在文件计数中包含目录。
另一种方法可能是使用递归 shell 函数 - 但请注意,这将执行深度优先搜索,因此结果的顺序可能不是您所期望的:
#!/bin/sh
_countrecurse() {
local c=0;
for f in "$1"/*; do
if [ -d "$f" ]; then
_countrecurse "$f";
else
c=$(($c+1))
fi
done
printf '%s: %d files\n' "$1" "$c"
}
_countrecurse "$1"
使用
./countrecurse path/to/topdir1/
这会不是将目录包含在文件计数中。