【问题标题】:Counting total files in directory - find vs ls计算目录中的文件总数 - find vs ls
【发布时间】:2016-09-04 20:31:19
【问题描述】:

有什么原因吗

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

建议反对

ls -1 | wc -l

(反之亦然?)

统计文件夹内文件/目录的总数

注意事项:

  1. 这个问题更关心只是计数的东西。
  2. 没有前导.的文件
  3. 可能存在带有\n 的非标准文件。

【问题讨论】:

  • 对于带有换行符的文件名,两者都将失败..就计数而言,我看不出有什么区别,两者都会失败..您在哪里找到建议?
  • 您是否需要考虑非标准文件名,包括带有\n(或\r)和其他嵌入控制字符等的文件名?在这种情况下,搜索find . -print0 解决方案,进行实验,然后发布一个新问题。如果您不需要完全防弹的解决方案,任何一个版本似乎都可以使用。祝你好运。
  • 您是否需要计算.exrc 类型的文件(前导. 字符)?然后你需要将它添加到cmd中。祝你好运。
  • @shellter。我不担心领先. 但可能有非标准文件

标签: bash find ls


【解决方案1】:

第一个命令...

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

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

ls -A | wc -l

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

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

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

这会将文件名传递给带有NUL 终止符的xargs,而不是依赖换行符,然后xargs 只是为每个文件打印一个空白行,我们计算来自xargs 的输出行数。

【讨论】:

  • 或者看this question的第二个回答。
  • 正如我在问题中提到的,没有带有前导 . 的文件,但有非标准文件,感谢您的解决方案。
  • 您的意思是ls -a | wc -l 吗? -A 选项说do not list implied . and ..
【解决方案2】:

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

  • ls 默认对文件列表进行排序
  • find 没有排序功能

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

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

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 2019-09-06
    • 2011-12-24
    • 2015-06-27
    • 2021-12-26
    • 1970-01-01
    • 2015-06-28
    • 2014-05-16
    • 2015-11-06
    相关资源
    最近更新 更多