查找目录中的文件数量

在Linux中有没有什么方法可以计算O(1)中目录(即直接子项)中的文件数目(与文件数量无关),而无需首先列出目录? 如果不是O(1),是否有合理有效的方法?

我正在寻找替代ls | wc -l ls | wc -l

Solutions Collecting From Web of "查找目录中的文件数量"

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

/bin/ls -1U | wc -l

避免你的shell中的别名,不排序输出,并列出每行1个文件(当输出到wc时不是必须的)。

原来的问题可以改写为“目录存储的数据结构是条目数量的计数吗?”,答案是否定的。 计数文件比readdir(2)/ getdents(2)更有效。

通过stat(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. 

在输出“ls”时,“/ bin / ls -Ua”命令不需要使用–format = single-column(-1)选项,如同在这种情况下的“wc”一样。 如果输出不是终端,那么“ls”命令将自动将其输出写入一列中。

ls-U选项不在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 do not sort; list entries in directory order

POSIX描述了-f像这样:

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

当文件名包含换行符时,像ls|wc -l这样的命令会给出错误的结果。

在zsh中,你可以做这样的事情:

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

Dglob_dots )包含名称以句点开头的文件, Nnull_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 ! -name . -prune-mindepth 1 -maxdepth 1的可移植替代品。

或者这里有另外一个通常不包含名称以句号开头的文件:

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

然而,上面的命令却包含了一些文件,当bash中的dotglob或者zsh中的glob_dots被设置时,这些文件的名称以句号开始。 当*匹配文件时,该命令将导致zsh中的默认设置出错。

我用这个命令..就像一个魅力..只是改变maxdepth ..这是子目录

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

据我所知,没有更好的选择。 这个信息可能是这个问题的焦点,你可能已经知道在Linux下(通常在Unix下)目录只是包含其他文件列表的特殊文件(我知道确切的细节将取决于特定的文件系统,但这是一般的想法)。 没有电话找到没有遍历整个列表的条目总数。 如果我错了,请让我正确。

我想你可以有更多的控制使用find

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

使用ls -1 | wc -l