题
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