目录中的最大索引节点数?

时间:2020-03-05 18:46:40  来源:igfitidea点击:

一个目录中是否有最大数量的inode?

我的目录超过200万个文件,无法使用ls命令对该目录进行操作。所以现在我想知道我是否已经超过Linux中inode的限制。在2 ^ 64数值限制之前是否有限制?

解决方案

回答

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

我知道在Windows中,至少随着文件夹中文件数量的增加,文件系统的性能将急剧下降,但是我认为linux不会受到此问题的影响,至少在使用命令提示符的情况下。如果我们尝试让鹦鹉螺之类的东西打开包含那么多文件的文件夹,上帝会。

我也想知道这些文件来自哪里。我们可以通过编程方式计算文件名吗?如果是这样,我们也许可以编写一个小程序将它们分类为多个子文件夹。通常,列出特定文件的名称将使我们可以访问尝试查找该名称失败的位置。例如,我在Windows上有一个包含约85,000个文件的文件夹,该文件夹可以在其中运行。

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

回答

否。Inode限制是针对每个文件系统的,并在文件系统创建时决定。我们可能会达到另一个极限,或者" ls"表现不佳。

试试这个:

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

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

回答

除非收到错误消息,否则ls会运行,但运行速度非常缓慢。我们可以尝试仅查看前十个文件,如下所示:

`ls -f | -10

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

ls>〜/ lots-of-files.txt

如果要对文件进行操作,则可以使用xargs。如果决定编写某种脚本来完成工作,请确保脚本将文件列表作为流而不是一次全部处理。这是移动所有文件的示例。

ls | xargs -I文件名mv文件名〜/ some / other / directory

我们可以将其与head结合使用,以移动较少数量的文件。

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

我们可以结合使用`ls |将文件放入一个shell脚本中,该脚本会将文件拆分为一堆目录,每个目录中的文件数量均在可管理的范围内。

回答

df -i应该告诉我们文件系统上已使用和可用的inode数量。

回答

试试ls -U或者ls -f

默认情况下,ls对文件进行字母排序。如果我们有200万个文件,则这种处理可能会花费很长时间。如果是" ls -U"(或者也许是" ls -f"),则将立即打印文件名。

回答

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

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

${topdir}/aa/aardvark
${topdir}/ai/airplane

如果使用UUID,GUID或者内容哈希值进行命名,则效果特别好。

回答

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

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

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

回答

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

我的解决方案是(如Charles Duffy在此线程中所写),用更少的归档重组子文件夹中的文件夹。

回答

另一个选择是find

找到。 -name * -exec somcommands {} \;

" {}"是绝对文件路径。

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

找到。名称*> ls.txt

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

找到。 -name * -exec ls -l {} \; > ls.txt

将为ls.txt中的每个文件打印所有信息形式ls