2008-09-02 159 views
32

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

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

+0

你的意思是最大数条目在一个单一的目录,对吧?毕竟,你可以在一个目录中制作200万个硬链接到同一个文件,这会导致同样的问题。 – 2008-09-17 04:08:36

回答

0

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

我知道在Windows中至少文件系统的性能会随着文件夹中文件数量的增加而急剧下降,但我认为linux并没有遭受这个问题,至少如果你使用的是命令提示符。上帝帮助你,如果你试图让鹦鹉螺等东西打开一个文件夹与许多文件。

我也想知道这些文件来自哪里。你能够通过编程来计算文件名吗?如果是这样的话,你可以编写一个小程序将它们分类到多个子文件夹中。通常列出特定文件的名称将授予您访问权限,因为试图查找名称将失败。例如,我在窗口中有一个文件夹,其中包含大约85,000个文件。

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

10

编号Inode限制是每个文件系统,并在文件系统创建时决定。你可能会遇到另一个限制,或者'ls'只是表现不佳。

试试这个:

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

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

0

除非您收到错误消息,否则ls正在运行,但速度很慢。你可以尝试寻找在刚刚前十个文件是这样的:

ls -f | head -10

如果你要需要看的,而文件的详细信息,你可以把它们放在一个文件中的第一。您可能希望将输出发送到目前不同的目录中!

ls > ~/lots-of-files.txt

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

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

你可以结合起来,与头部移动的文件的数量较少。

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

你或许可以结合ls | head成一个shell脚本,将文件分割成在每个文件的管理数量一堆目录。

+1

ls |头-10不能立即得到结果,因为ls正在排序 - 所以在它能打印任何东西之前它需要读取所有东西。 – 2008-10-20 03:20:26

+0

在这种情况下,请尝试:ls -f |头-10 – 2008-10-27 17:20:34

48

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

17

尝试ls -Uls -f

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

3

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

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

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

此工作得特别好,如果使用UUID,的GUID或内容的散列值来命名。

1

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

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

虽然没有强迫限制目录中的条目数,这是很好的做法,有一些限制,你预料到的条目。

0

对于NetBackup,即分析客户的目录下的二进制文件执行某种类型的上市,通过文件的数量巨大超时的每个文件夹(约一百万每个文件夹,SAP工作目录)英寸

我的解决办法(如在此线程查尔斯达菲写),重组子文件夹中的文件夹用更少的档案。

-1

另一种选择是find

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

{}是绝对的文件路径。

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

find . -name * > ls.txt

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

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

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

相关问题