在深层创建的目录上

在深层创建的目录上
  1. 在Windows中,路径中的字符数有一定的限制,这限制了目录可以创建的深度。我想知道Linux下的情况是什么样的?
  2. 您是否有一些关于如何组织目录以实现与深层目录结构相同或足够接近的好处(例如有利于组织)的建议,同时减少可能遇到的潜在问题?

答案1

实际限制可能取决于您正在使用的文件系统和内核。

要找出特定安装点的限制,您可以使用getconf(例如/在我的机器上):

$ getconf  PATH_MAX /
4096
$ getconf  NAME_MAX /
255

PATH_MAX是最大总长度(NAME_MAX如果是文件名)。内核限制include/linux/limits.h位于内核源代码:

#define NAME_MAX         255    /* # chars in a file name */
#define PATH_MAX        4096    /* # chars in a path name including nul */

有关文件系统限制的列表,请参阅文件系统比较

文件系统限制规定了目录的最大嵌套级别(如果有)以及该文件系统的文件和目录名称的长度。内核限制决定了引用路径的字符串可以有多长。
实际上,您可以拥有超出限制的嵌套结构PATH_MAX。但是您将无法使用从根开始的完全限定路径来引用它。如果您使用如此深层的结构,您还应该预料到奇怪的软件错误,因为许多代码期望路径适合PATH_MAX缓冲区,并且检查ENAMETOOLONG错误(并正确地从中恢复)可能不是经过最好测试的代码路径之一。

至于组织,只要使用感觉更自然的东西即可。如果您想要脚本安全/友好,请保持层次结构合理,避免奇怪的字符(和空格)。这些限制相当慷慨。如果你接近了PATH_MAX,可能是时候重新组织一下了。


如果您确实想测试事物在非常长的路径中的行为方式,这里有一种生成巨大路径的快速方法:

#! /usr/bin/perl

my $kd = "a" x 255;
for my $i (1..64) {
  mkdir($kd); chdir($kd);
}

如果您想要深层层次结构,请尝试:

#! /usr/bin/perl

my $kd = "a";
for my $i (1..8192) {
  mkdir($kd); chdir($kd);
}

并且你可以获得:

$ pwd | wc -c
16394

ksh有点困惑:

$ cd ..
ksh: cd: ..: [File name too long]

bash确实执行了cd ..,但提示混乱,目录名称未解析 - 所以pwd | wc -c之后实际上是 16397。

答案2

AFAIK 是 include/linux/limits.h 中定义的路径长度限制,为 4096 个字符(包括最后一个Null字节)。文件名的长度限制为 255 个字符。然而,实际的文件系统可能会强制执行进一步的限制。

答案3

我只是尝试了一个简单的脚本来测试这个(在我的 ext4 驱动器上):

dir=test
while mkdir $dir; do dir=$dir/test; done

最终给出的错误是File name too long.我曾经find test | wc -l获得深度,它说 819,我已经 2 深了,总共 821。然后我尝试使用一个字母名称:

dir=a
while mkdir $dir; do dir=$dir/a; done

File name too long在 2048 深度(总共 2050) 处死于同样的信息。

然后我想到了cd进入我创建的每个目录,这样命令行就不会增长:

while mkdir a; do cd a; done

它仍在运行,并且似乎比其他两个(目前为 2214)慢很多。

我调查了一下,发现的只是一份声明(最底部的注释 14)Linux 对路径名有 4096 字节的限制。这是相当多的,我认为你不需要太担心。至于良好的组织,请以对您来说最有意义的方式组织事物。

相关内容