首页 > 解决方案 > 我无法列出大目录

问题描述

我有一个很大的目录(非常大),其中 ls 不起作用,我也尝试使用 for 对其进行迭代,但没有运气。

这个目录在一个 gluster 卷中......有什么想法吗?

更多信息:

问候

标签: linuxbashglusterfs

解决方案


您几乎可以肯定可以使用系统调用(在syscalls(2)中列出)和相关函数,例如opendir(3)readdir(3)(它们在内部使用您不想直接使用的 getdents(2)closedir ) 、stat (2)nftw(3);当然,您需要编写一个特定的程序(可能用 C 语言,或者至少用 Python 语言)。

下一次,即使对于巨大(PB 大小)的文件系统,也要注意避免每个目录有超过几千个条目(所以组织你的文件,比如00/00/0001.jpeg……01/23/4567.jpeg等等,而不是00000001.jpeg……01234567.jpeg等等在一个目录中) )。如果您保留小型目录(即使在 PB 大小的文件系统中),您将使您的 shell 更快乐、更可用(甚至可能是您的内核)。

但是,最近的文件系统(如 EXT4 或 BTRFS)能够在目录中包含数百万个条目。但是 shells(和globbing,参见glob(7) ...)对此并不满意。我的猜测是,/bin/ls 没有参数(或至少/bin/ls -f获得未排序的列表)应该可以工作(参见ls(1))。

一些文件系统,即使每个目录有数百万个条目,也可能需要线性时间来访问它们(参见path_resolution(7)ext4(5)等),否则您可能需要为mount(8)(例如dir_indexfor ext4)。

请记住,通配是在调用execve(2)之前由您的 shell 完成的,这确实有限制(通常,程序参数最多几十万字节,因此程序的扩展参数不超过几千个,否则会execve失败E2BIG)。


推荐阅读