计算目录中的总文件数 - find vs ls

Counting total files in directory - find vs ls

有没有理由

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

建议反对

ls -1 | wc -l

(或者反之亦然?)

计算一个文件夹内files/directories的总数

备注:

  1. 这个问题更关心只是计算的东西。
  2. 没有以 .
  3. 开头的文件
  4. 可能有非标准文件,其中包含 \n

第一个命令...

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

...将列出以 . 开头的文件和目录,而您的 ls 命令不会。等效的 ls 命令是:

ls -A | wc -l

两者都会给你相同的答案。正如人们在评论中指出的那样,如果有包含嵌入换行符的条目,这两个都会给你错误的答案,因为上面的命令只是计算输出的行数。

这是计算文件数量的一种方法,它独立于 文件名怪癖:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0i echo | wc -l

这将文件名传递给 xargs 并带有 NUL 终止符,而不是依赖换行符,然后 xargs 简单地为每个文件打印一个空行,我们计算行数xargs.

的输出

find(1)优于ls(1)的原因是

  • ls 默认排序文件列表
  • find没有排序能力

对于大型数据集,排序可能会非常消耗内存。因此,即使您可以使用 ls -fls -U 来禁用排序,我发现使用 find 更安全,因为我 知道 目录列表获胜' 被排序,无论传递给它什么选项。

无论如何,告诉命令少打印每个文件有助于提高性能和正确性。性能,因为命令可以避免 stat(2) 调用和正确性,因为如果你例如仅打印 inode,您可以确定文件名不会影响输出(例如换行符、回车符 returns 或其他奇数字符。)