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 之后。