linux - 我无法列出大目录
问题描述
我有一个很大的目录(非常大),其中 ls 不起作用,我也尝试使用 for 对其进行迭代,但没有运气。
这个目录在一个 gluster 卷中......有什么想法吗?
更多信息:
- Gluster vol 通过简单的选项安装在 fstab 中。
- 我试过 f in * ; 用 $f 做点什么;完毕
- 现在我正在尝试 rsync -a --delete empty-dir/ my-dir/
问候
解决方案
您几乎可以肯定可以使用系统调用(在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_index
for ext4
)。
请记住,通配是在调用execve(2)之前由您的 shell 完成的,这确实有限制(通常,程序参数最多几十万字节,因此程序的扩展参数不超过几千个,否则会execve
失败E2BIG
)。
推荐阅读
- c++ - 围绕特定轴旋转 gluCylinder()?
- batch-file - BAT文件依次打开.SQL文件,依次粘贴追加到TXT文件
- r - 如何使用 dplyr 将组中的两个观察结果组合成一个新观察结果
- excel - 用于了解 URL 有效性的 VBA 代码将检查 URL 是否存在
- amazon-web-services - AWS Glue 目录 API:不同结构的元数据中的参数字段
- azure - 使用 arm 从密钥库导入 apns certyfikace
- java - 如何使用 MockMVC 对 Spring-Boot REST 端点进行单元测试,其中路径映射是环境变量?
- javascript - 自动登录 HTML JS 因 getElementBy() 而失败
- typescript - 如何检查数组是否为数字类型并允许 + 运算符
- python - Python - 解码已经解码的字符串?