Linux中是否有任何方法可以计算O(1)中目录中的文件数(即直接的孩子)(独立于文件数)而无需首先列出目录?如果不是O(1),是否有相当有效的方法?

我正在寻找一种替代方案 ls | wc -l.

有帮助吗?

解决方案

ReadDir并不像您想象的那样昂贵。诀窍是避免对每个文件进行统计,并((可选))对LS的输出进行排序。

/bin/ls -1U | wc -l

避免使用外壳中的别名,不会对输出进行排序,并每行列出1个文件(在将输出输出到WC时绝对不需要)。

最初的问题可以改写为“目录的数据结构是否存储了条目数量?”,答案是否定的。没有比ReadDir(2)/GetDents(2)更有效地计数文件的方法。

其他提示

一个人可以获取给定目录的子目录的数量,而无需通过stat'ing(stat(1)或Stat(2))遍历整个列表,并观察到该目录的链接数量。带有n个子目录的给定目录的链接计数为n+2,一个链接的一个链接,用于每个子目录的“ ..”条目,以及两个链接。和“ ..”给定目录的条目。

但是,在不遍历整个列表的情况下,无法获得所有文件的数量(无论是常规文件还是子目录) - 这是正确的。

但是,“/bin/ls -1U”命令将无法获得所有条目。它会得到 只要 这些目录条目不从点(。)字符开始。例如,它不会计算许多登录$主目录中的“ .profile”文件。

可以使用“/bin/ls -f”命令或“/bin/ls -ua”命令来避免排序并获取所有条目。

也许不幸的是,出于您的目的,“/bin/ls -f”命令或“/bin/ls -ua”命令也将计算“”。和“ ..”每个目录中的条目。您将必须从计数中减去2,以避免计算这两个条目,例如以下内容:

expr `/bin/ls -f | wc -l` - 2     # Those are back ticks, not single quotes.

- format =单列(-1)选项在输出“ ls”输出时的“/bin/ls -ua”命令上不需要,如在这种情况下为“ wc”。如果输出不是终端,则“ LS”命令将自动将其输出写入单列。

-U 选项 ls 不在posix和OS X中 ls 它的含义与gnu不同 ls, ,那就是 -t-l 使用创建时间而不是修改时间。 -f 在POSIX中作为XSI扩展。 GNU的手册 ls 描述 -f 作为 do not sort, enable -aU, disable -ls --color-U 作为 do not sort; list entries in directory order.

Posix描述 -f 像这样:

强制每个参数被解释为目录,并列出每个插槽中发现的名称。此选项应关闭 -l, -t, -s, , 和 -r, 并将打开 -a;该顺序是目录中显示条目的顺序。

命令 ls|wc -l 当文件名包含新线时,给出错误的结果。

在ZSH中,您可以做这样的事情:

a=(*(DN));echo ${#a}

D (glob_dots)包括其名称以段开始的文件和 N (null_glob)导致命令不导致空目录中的错误。

或在Bash中相同:

shopt -s dotglob nullglob;a=(*);echo ${#a[@]}

如果 IFS 包含ASCII数字,添加双引号 ${#a[@]}. 。添加 shopt -u failglob 为了保证 failglob 不设置。

便携式选项是使用 find:

find . ! -name . -prune|grep -c /

grep -c / 可以替换 wc -l 如果文件名不包含新线。 ! -name . -prune 是便携式的替代品 -mindepth 1 -maxdepth 1.

或这是另一种替代方案,通常不包括名称以一段时间开头的文件:

set -- *;[ -e "$1" ]&&echo "$#"

但是,上面的命令确实包括该名称开始的文件,该文件从一个选项之类的时期开始 dotglob 在bash或 glob_dots 在ZSH中设置。什么时候 * 匹配不匹配文件,命令会导致ZSH中的错误和默认设置。

我使用了此命令..像魅力一样的工作。

find * -maxdepth 0 -type d -exec sh -c "echo -n {} ' ' ; ls -lR {} | wc -l" \;

我认为您可以使用更多的控制权 find:

find <path> -maxdepth 1 -type f -printf "." | wc -c
  • find -maxdepth 1 不会深入到文件的层次结构。
  • -type f 允许过滤到文件。同样,您可以使用 -type d 目录。
  • -printf "." 为每场比赛打印一个点。
  • wc -c 计数字符,因此计算了由 print...这意味着计算给定路径中存在多少个文件。

据我所知,没有更好的选择。此信息可能是该问题的主题,您可能已经知道,在Linux(通常在UNIX下)的目录下只是特殊文件,其中包含其他文件列表(我知道确切的详细信息将取决于特定文件系统,但这是一个总体想法)。而且没有呼吁在不穿越整个列表的情况下找到参赛者的总数。如果我错了,请让我正确。

对于当前目录中的所有文件的数量,请尝试以下操作:

ls -lR * | wc -l

使用LS -1 | WC -L

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top