【问题标题】:Maximum number of inodes in a directory? [closed]目录中的最大 inode 数? [关闭]
【发布时间】:2010-09-07 14:38:05
【问题描述】:

单个目录中有最大数量的 inode 吗?

我有一个包含超过 200 万个文件的目录,并且无法让 ls 命令针对该目录工作。所以现在我想知道我是否超出了 Linux 中 inode 的限制。在 2^64 数字限制之前是否有限制?

【问题讨论】:

  • 您的意思是单个目录中条目 的最大数量,对吗?毕竟,你可以在一个目录中对同一个文件进行 200 万个硬链接,这会导致同样的问题。

标签: linux bash unix command ls


【解决方案1】:

df -i 应该会告诉您文件系统上已使用和空闲的 inode 数量。

【讨论】:

  • 这不是问题。例如 ext3/ext4 文件系统中的条目数有一个固定的限制,但我忘记了它是多少,数百万。我认为 1600 万左右,所以是的,有可能达到这个限制。
【解决方案2】:

试试ls -Uls -f

ls 默认情况下按字母顺序对文件进行排序。如果您有 200 万个文件,那么这种排序可能需要很长时间。如果是ls -U(或者可能是ls -f),那么文件名将被立即打印出来。

【讨论】:

    【解决方案3】:

    没有。 Inode 限制是每个文件系统的,并在文件系统创建时决定。您可能会达到另一个限制,或者“ls”可能表现不佳。

    试试这个:

    tune2fs -l /dev/DEVICE | grep -i inode
    

    它应该告诉你各种与 inode 相关的信息。

    【讨论】:

      【解决方案4】:

      你击中的是 ls 的内部限制。这是一篇解释得很好的文章: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/

      【讨论】:

        【解决方案5】:

        最大目录大小取决于文件系统,因此确切的限制会有所不同。但是,拥有非常大的目录是一种不好的做法。

        您应该考虑通过将文件分类到子目录来缩小目录。一种常见的方案是将前两个字符用于一级子目录,如下所示:

        ${topdir}/aa/土豚 ${topdir}/ai/飞机

        如果使用 UUID、GUID 或内容散列值进行命名,这会特别有效。

        【讨论】:

          【解决方案6】:

          正如 Rob Adams 所指出的, ls 在显示文件之前对其进行排序。请注意,如果您使用 NFS,NFS 服务器将在发送目录之前对其进行排序,并且 200 万个条目可能需要比 NFS 超时更长的时间。这使得该目录无法通过 NFS 列出,即使使用 -f 标志也是如此。

          其他网络文件系统也可能如此。

          虽然对目录中的条目数量没有强制限制,但最好对您预期的条目进行一些限制。

          【讨论】:

            【解决方案7】:

            你能得到文件数量的真实计数吗?它是否非常接近 2^n 边界?你能不能简单地用完 RAM 来保存所有文件名?

            我知道在 Windows 中,至少文件系统性能会随着文件夹中文件数量的增加而急剧下降,但我认为 linux 不会遇到这个问题,至少如果你使用命令提示符的话。如果您尝试使用 nautilus 之类的工具打开包含这么多文件的文件夹,请上帝帮助您。

            我也想知道这些文件是从哪里来的。您是否能够以编程方式计算文件名?如果是这种情况,您也许可以编写一个小程序将它们分类到多个子文件夹中。通常列出特定文件的名称将授予您访问尝试查找该名称将失败的位置。例如,我在 Windows 中有一个文件夹,其中包含大约 85,000 个文件。

            如果这项技术成功,您可能会尝试找到一种方法使这种排序永久化,即使它只是将这个小程序作为 cron 作业运行。如果您可以在某处按日期对文件进行排序,它将特别有效。

            【讨论】:

              【解决方案8】:

              除非您收到错误消息,否则 ls 正在工作,但速度很慢。您可以尝试只查看前十个文件,如下所示:

              ls -f | head -10

              如果您暂时需要查看文件详细信息,可以先将它们放入文件中。您可能希望将输出发送到与您当前列出的目录不同的目录!

              ls > ~/lots-of-files.txt

              如果你想对文件做点什么,你可以使用 xargs。如果您决定编写某种脚本来完成这项工作,请确保您的脚本将文件列表作为流而不是一次全部处理。这是移动所有文件的示例。

              ls | xargs -I thefilename mv thefilename ~/some/other/directory

              您可以将其与 head 结合以移动较少数量的文件。

              ls | head -10000 | xargs -I x mv x /first/ten/thousand/files/go/here

              您可能可以将ls | head 组合到一个shell 脚本中,以便将文件拆分为一堆目录,每个目录中的文件数量可管理。

              【讨论】:

              • ls | head -10 不能立即得到结果,因为 ls 正在排序——所以它需要在打印任何内容之前读取所有内容。
              • 在这种情况下,尝试:ls -f |头 -10
              【解决方案9】:

              对于 NetBackup,分析客户端中目录的二进制文件会执行某种类型的列表,每个文件夹中的大量文件都会超时(每个文件夹大约一百万,SAP 工作目录)。

              我的解决方案是(正如 Charles Duffy 在此线程中所写),将文件夹重新组织到归档较少的子文件夹中。

              【讨论】:

                【解决方案10】:

                另一个选项是find:

                find . -name * -exec somcommands {} \;

                {} 是绝对文件路径。

                优点/缺点是文件一个接一个地处理。

                find . -name * > ls.txt

                将打印ls.txt 中的所有文件名

                find . -name * -exec ls -l {} \; > ls.txt

                将打印ls.txt中每个文件的所有信息表格ls

                【讨论】:

                • 如果你不希望它被 shell 扩展,你必须在单引号内包含通配符(如果有 +2 百万个文件,它可能会很长!)
                • 您应该了解xargs 命令。它比 find 命令的 -exec 选项高效得多。
                • @Didier Trosset,新版POSIX标准支持find ... -exec {} +(而不是-exec {} ;),效率与xargs相似。
                猜你喜欢
                • 1970-01-01
                • 2012-04-15
                • 1970-01-01
                • 2011-05-13
                • 2011-01-04
                • 2012-09-16
                • 2011-05-25
                • 2012-05-17
                • 2016-05-09
                相关资源
                最近更新 更多