查找目录中的文件数

yas*_*sin 25 linux directory shell file counting

Linux中是否有任何方法可以计算O(1)中目录(即直接子节点)中的文件数(与文件数无关),而无需先列出目录?如果不是O(1),是否有合理有效的方法?

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

Phi*_*hil 37

readdir并不像你想象的那么昂贵.诀窍是避免统计每个文件,并(可选)对ls的输出进行排序.

/bin/ls -1U | wc -l

避免shell中的别名,不对输出进行排序,并列出每行1个文件(在将输出汇总到wc时不是绝对必要的).

原始问题可以改为"目录的数据结构是否存储条目数的计数?",答案为否.没有比readdir(2)/ getdents(2)更有效的文件计数方法.


小智 11

通过stat'ing(stat(1)或stat(2))给定目录并观察到该目录的链接数,可以获得给定目录的子目录数而不遍历整个列表.具有N个子目录的给定目录将具有N + 2的链接计数,每个子目录的"..."条目的一个链接,以及"."的两个链接.和给定目录的".."条目.

但是,如果没有遍历整个列表,则无法获取所有文件的数量(无论是常规文件还是子目录) - 这是正确的.

但是,"/ bin/ls -1U"命令不会获得所有条目.它会得到唯一不以点(.)字符开头的目录条目.例如,它不会计算许多登录$ HOME目录中的".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.
Run Code Online (Sandbox Code Playgroud)

在管道"ls"输出时,"/ bin/ls -Ua"命令中不需要--format =单列(-1)选项,在本例中为"wc".如果输出不是终端,"ls"命令将自动将其输出写入单个列.