【问题标题】:Fast way to get number of files matching a pattern获取与模式匹配的文件数量的快速方法
【发布时间】:2012-05-02 08:03:39
【问题描述】:

我现在有一个包含 8K 文件的目录。在接下来的一个月左右,这个数字将增长到 100K 以上。我需要能够计算目录中匹配特定模式的文件。模式匹配会增加大量时间:

[XXXXXX@login-0-0 scripts]$ time ls | grep . -c
8373

real    0m0.115s
user    0m0.109s
sys 0m0.009s
[XXXXXX@login-0-0 scripts]$ time ls *.o* | grep . -c
6262

real    0m1.997s
user    0m0.121s
sys 0m0.270s

随着文件数量的不断增加,按模式计数的时间将变得过多。我可以解决这个问题吗?

附带说明,文件系统是 Lustre,我可以处理非便携式解决方案。

【问题讨论】:

    标签: unix filesystems ls


    【解决方案1】:

    也许让你慢下来的原因是你的 glob 实际上是由 bash 扩展的,并且参数被传递给 ls,所以这是一些额外的工作。这对我有用:

    user@host:~/junk$ time find . | wc -l
    188318
    
    real    0m0.202s
    user    0m0.076s
    sys 0m0.136s
    
    user@host:~/junk$ time find . -name '*.o' | wc -l
    374
    
    real    0m0.243s
    user    0m0.160s
    sys 0m0.080s
    

    速度差别不大。请注意,这是递归的,但如果您不想这样做,可以设置 maxdepth。

    也许我该清理一些垃圾了……

    【讨论】:

    • 如果一个文件的名称中有换行符,它可能被算作两个或多个文件。我会这样做:find . -maxdepth 1 -name '*.o' -printf "\n" | wc -l。 (在这种情况下,-name '*.o' 会阻止 . 被计算在内,但在其他情况下,您可能还需要 -mindepth 1 来排除 .。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多