V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
frmongo
V2EX  ›  程序员

Linux 怎么查询巨量文件的精确数量?

  •  
  •   frmongo · 2020-11-04 10:32:37 +08:00 · 3103 次点击
    这是一个创建于 1479 天前的主题,其中的信息可能已经有所发展或是发生改变。
    linux 一个文件夹里有大概接近 2000 万个文件(没有子文件夹)。
    使用 ls . | wc -l 这个命令执行查询数量会内存耗尽,有没有办法能精确查询文件数量呢?
    22 条回复    2020-11-04 17:57:13 +08:00
    lxk11153
        1
    lxk11153  
       2020-11-04 10:38:03 +08:00
    可以放这么多吗?[doge]
    yuanbo6
        2
    yuanbo6  
       2020-11-04 10:40:18 +08:00
    惊了
    cydian
        3
    cydian  
       2020-11-04 10:41:22 +08:00 via Android
    可以放这么多,inode 够用就行
    slimhigh
        4
    slimhigh  
       2020-11-04 10:41:34 +08:00
    自己写个程序遍历文件夹。
    Osk
        5
    Osk  
       2020-11-04 10:42:13 +08:00
    没有实战过, 不过可以考虑这些方法优化:

    ls 命令本身会进行排序, 文件数目多时可能会很慢. 使用 `ls -U` 不排序来提升第一个命令的动作.

    把 ls 的输出重定向到文件中, 而不是管道, 后续再用其他工具处理?
    sonice
        6
    sonice  
       2020-11-04 10:42:47 +08:00
    egen
        7
    egen  
       2020-11-04 10:43:14 +08:00
    ls -f1 | wc -l
    acmore
        8
    acmore  
       2020-11-04 10:43:22 +08:00
    locate -cr 'path_to_your_folder'
    qinlou
        9
    qinlou  
       2020-11-04 10:43:34 +08:00
    find . | wc -l 或者 find . >count.file; wc -l file
    novanul
        10
    novanul  
       2020-11-04 10:43:44 +08:00
    sudo updatedb && locate --regex ^$(pwd) | wc -l 不知道可不可以
    Liutos
        11
    Liutos  
       2020-11-04 10:48:54 +08:00
    用 ls -f 试试,可以让输出的内容不排序,这样可以不用将所有文件名先读入内存。
    frmongo
        12
    frmongo  
    OP
       2020-11-04 10:49:58 +08:00
    @Osk #5 查询了一下 ls -U 重定向到 txt 文件,没有报错,生成的 txt 文件有 266M
    frmongo
        13
    frmongo  
    OP
       2020-11-04 10:56:07 +08:00
    @Osk #5 我用这个命令生成了一个名字,然后拿到 win 下用 notepad++查看了行数作为文件数量是 1 千 8 百万个文件

    ls -U dir_name >lst.txt
    frmongo
        14
    frmongo  
    OP
       2020-11-04 11:02:35 +08:00
    或者用这个:
    ls -U dir_name >lst.txt
    wc -l lst.txt
    frmongo
        15
    frmongo  
    OP
       2020-11-04 11:04:03 +08:00   ❤️ 1
    ls -U dir_name/ | wc -l 也可以
    mingl0280
        17
    mingl0280  
       2020-11-04 11:52:04 +08:00   ❤️ 1
    ls -f | wc -l
    find . -name "*" | wc -l
    mingl0280
        18
    mingl0280  
       2020-11-04 11:52:59 +08:00
    备注一下,可能有些系统有 locate,locate -c 就行
    dorothyREN
        19
    dorothyREN  
       2020-11-04 14:23:35 +08:00
    ls -l > a && wc -l a
    ungrown
        20
    ungrown  
       2020-11-04 16:00:58 +08:00
    用 python 的`os.walk`试试,那玩意不是一下子全部遍历的,是逐级返回的,应该不会爆内存
    openbsd
        21
    openbsd  
       2020-11-04 17:42:35 +08:00
    tree ?
    secsilm
        22
    secsilm  
       2020-11-04 17:57:13 +08:00
    python 的话,可以用 Path(dir).iterdir(),返回的是 generator,不耗内存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:51 · PVG 18:51 · LAX 02:51 · JFK 05:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.