我可以使用“ls -l”确定目录中的子目录数量吗?

我可以使用“ls -l”确定目录中的子目录数量吗?

使用 显示目录时ls -l,它们的链接数(输出中的第二个字段)至少为两个:一个用于目录名称,一个用于.

$ mkdir foo
$ ls -l
total 2
drwxr-xr-x  2 user   wheel  512  4 oct 14:02 foo

总是假设 2 以上的链接数量对应于该目录中的子目录数量(..链接)是否安全?

答案1

这是通常在 unix 系统上,目录的链接数是子目录数加 2,这是正确的。但是,在某些情况下,情况并非如此:

  • 一些 unice 允许硬链接到目录。那么就会出现2个以上不对应子目录的链接。

  • 有些文件系统的目录没有.和 的条目..。这GNU 查找手册在讨论其选项时提到了一些示例(禁用假设存在于所有目录中-noleaf的优化):“CD-ROM 或 MS-DOS 文件系统或 AFS 卷安装点”...

计算子目录数量的几乎可靠的方法(如果文件名包含换行符,它仍然可能失败)是

$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)

更可靠的方法是使用 shell glob*/.*/;像往常一样,处理模式不匹配的情况有点麻烦(除了在 bash 和 zsh 中,您可以打开该nullglob选项)。

答案2

这是在 Bash 中计算子目录(非递归)的另一种方法:

(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c  # wc counts null bytes
)

由于每个文件名都以 ASCII NUL 字符结尾,因此即使文件名包含换行符,该文件也应该可以正常工作。

答案3

你可以尝试:

ls -l |grep ^d | wc -l

答案4

不要用于ls。这是一种适用的方法全部文件名,甚至包含换行符的文件名,因为它只打印换行符而不是文件名:

find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l

编辑:当前版本不会导致任何警告,因为-mindepth-maxdepth应该在之前-type(在检查目录之前修剪目录树,以节省时间)。

相关内容