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


8

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

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

始终假设2以上的链接数与该dir(..链接)中的子目录数相对应是否安全?

Answers:


7

这是通常在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字符结尾,所以即使文件名包含换行符也可以正常工作。



1

我在文档中找不到任何可以确认链接数量在子目录数量上始终为+2的信息。

但是,要找到正确的数量,请使用:

find . -type d -mindepth 1  -maxdepth 1 | wc -l

或者,如果您必须使用ls -l,请参阅其他答案。


我认为您的意思是-type d,但是:1.这需要GNU查找;2.您需要减去1作为起始目录(或pass -mindepth 1)。
吉尔(Gilles)'所以

0

不要ls为此使用。这是一种适用于所有文件名(甚至包含换行符的文件名)的方式,因为它仅打印换行符而不是文件名:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.