使用 显示目录时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
(在检查目录之前修剪目录树,以节省时间)。