目录中的最大inode数量?

时间:2008-09-02 19:29:17

标签: linux bash unix command ls

单个目录中是否存在最大数量的inode?

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

10 个答案:

答案 0 :(得分:52)

df -i应该告诉你文件系统上使用和免费的inode数量。

答案 1 :(得分:17)

尝试ls -Uls -f

默认情况下,

ls按字母顺序对文件进行排序。如果您有200万个文件,那么这种类型可能需要很长时间。如果ls -U(或者ls -f),则会立即打印文件名。

答案 2 :(得分:10)

没有。 Inode限制是按文件系统,并在文件系统创建时决定。你可能会达到另一个极限,或者'ls'表现不佳。

试试这个:

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

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

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

如果使用UUID,GUID或内容哈希值进行命名,这种方法效果特别好。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

你能真正计算出文件数吗?它是否非常接近2 ^ n边界?你可以简单地用完RAM来保存所有的文件名吗?

我知道在windows中至少文件系统性能会随着文件夹中文件数量的增加而急剧下降,但我认为linux并没有受到这个问题的影响,至少在使用命令提示符时是这样。如果你试图让像nautilus这样的东西打开一个包含那么多文件的文件夹,上帝会帮助你。

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

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

答案 7 :(得分:0)

除非您收到错误消息,否则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脚本中,然后将文件拆分成一堆目录,每个目录中都有可管理的文件数。

答案 8 :(得分:0)

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

我的解决方案是(正如Charles Duffy在此帖子中所写的那样),用较少的档案重新组织子文件夹中的文件夹。

答案 9 :(得分:-1)

另一个选项是find

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

{}是绝对文件路径。

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

find . -name * > ls.txt

会在ls.txt

中打印所有文件名

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

会在ls.txt

中打印每个文件的所有信息