在深层创建的目录上

Tim*_*Tim 6 directory

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

Mat*_*Mat 21

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

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

$ getconf  PATH_MAX /
4096
$ getconf  NAME_MAX /
255
Run Code Online (Sandbox Code Playgroud)

PATH_MAXNAME_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 */
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

$ getconf  PATH_MAX /
4096
$ getconf  NAME_MAX /
255
Run Code Online (Sandbox Code Playgroud)

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

#define NAME_MAX         255    /* # chars in a file name */
#define PATH_MAX        4096    /* # chars in a path name including nul */
Run Code Online (Sandbox Code Playgroud)

你可以得到:

$ pwd | wc -c
16394
Run Code Online (Sandbox Code Playgroud)

但是ksh有点糊涂:

$ cd ..
ksh: cd: ..: [File name too long]
Run Code Online (Sandbox Code Playgroud)

bash确实做了cd ..,但提示搞砸了,目录名没有解析 -pwd | wc -c实际上是 16397 之后。

  • 请注意,虽然存在路径长度限制,但目录深度或该深度的绝对路径没有限制。您可以通过“cd”进入它们并使用相对路径来创建和访问任意深度的目录。 (3认同)
  • @Tim 您可以拥有一个绝对路径为“/000000001/00000000002/…/000004090”的目录,并在那里创建一个子目录“000004100”。4100 目录的绝对路径长度为 4100 字节,因此您将无法使用它。但是您将能够使用连续的“cd”命令进入 4100 并在那里创建更多文件和目录,通过利用相对路径,仅使用长度小于 4096 字节的路径。 (2认同)