对bash中文件名长度的限制


76

以下问题仅适用于bash和linux:

  1. 文件的绝对路径名中的字符数是否有限制?
  2. 仅文件名(无扩展名)的字符数有限制吗?

如果是这样,这些限制是什么?如果它们是系统特定的,我该如何访问它们?


6
我一直想知道人们怎么能达到文件名长度这样的限制。你在做什么?
卡罗莉·霍瓦斯

@yi_H:大声笑!没什么,只需将大文件名(绝对路径)写入文件并从文件中读取名称即可。阅读发生在星号内,我必须弄清楚需要阅读多少个字符。这个问题从那里抛开了。
斯里拉姆

1
这闻起来很像家庭作业……但是最终它属于ServerFault,SuperUser或Unix&Linux。
鲍比(Bobby)

1
@Bobby:如果是家庭作业,我会加上标签。
斯里拉姆

1
@Bobby:不用担心,我没有把您的评论当作侮辱或其他任何形式。
斯里拉姆

Answers:


71

这在很大程度上取决于文件系统。对于ext FS(当前在Linux上最常用):

  • 文件名最大长度:255个字节
  • 最大路径长度:无

扩展名不是FS知道的,它包含255个字节,包括扩展名(您可以使用不带任何扩展名的文件名)。

这里是每个FS的这些限制的更详尽列表。

文件系统的扩展名也可以更改最大长度。例如,eCryptFS使用较低文件名的一部分来保留元数据,并将文件名的最大长度限制为143个字符。请参阅Ubuntu eCryptFS启动板条目。


7
在linux / limits.h中还定义了Linux内核施加的限制PATH_MAX,通常为4096个字符。最后一个字符保留给字符串终止符空字符。
BeowulfNode42 2014年

同样,每个应用程序都有其自己的限制。
BeowulfNode42 2014年

如果有人有任何怀疑:这个组合响应这一ecryptfs,我已经能够验证漏洞仍未得到解决(尽管阅读本身让我觉得它永远不会被解决的bug)
ThanksForAllTheFish

38

在临时目录中,运行:

num=1
while [ true ]
do 
   if ! touch $(printf "%${num}s"  | tr ' ' 'a')
   then
       echo $num
       break
   fi
   ((num++))
done

我得到:

touch: cannot touch `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': File name too long
256

这意味着我的上限是255。


1
我得到144,这意味着我的上限是143。为什么这么短!我正在运行64位的Ubuntu 16.04 LTS。
加布里埃尔·斯台普斯

eCryptFS使用部分文件名作为元数据。
安德鲁·比尔斯

15

在Mac OS X 10.6.7上:

man getconf
getconf NAME_MAX /   # 255 bytes
getconf PATH_MAX /   # 1024 bytes

# check file path length with wc before using touch, mkdir, etc.
echo '/very/lllooooonnnnnggggg/file/path.txt' | wc -c

10

我指的是其他答案,请支持。

在Linux上,文件名和路径名的长度取决于:

要动态获取这些属性

  • 创建文件名(或路径名)的时间越来越长,如dogbane所述
  • 使用timgetconf提议的命令,该命令在Linux上也可用:

    $ getconf NAME_MAX /mnt/sda2/
    255
    $ getconf PATH_MAX /mnt/sda3/
    4096
    

8

单一UNIX规范提到了limit.h中的NAME_MAXPATH_MAX常量,可以使用pathconf读取它们。但是,这非常依赖于文件系统,因此您不太可能达到此限制。

注意:作为程序员,您不应硬编码这些限制。您应该使用动态分配,以便只要基础系统允许您执行任何操作,它就将始终有效。


4
  1. 文件的绝对路径名中的字符数是否有限制?

就在这里。

在Linux上的文件名长度限制问题上,请参见sfp的答案服务器故障

简而言之:

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

对于:

  1. 仅文件名(无扩展名)的字符数有限制吗?

在相同的链接答案中:

#define NAME_MAX         255    /* # chars in a file name */

1
感谢您链接到关于serverfault的类似问题。但是我认为sft的答案不是很好。我希望来自@WerkkreW的答案提供良好的链接:en.wikipedia.org/wiki/Comparison_of_file_systems#Limits
oHo

1
该链接是关于文件系统的,而不是问题中所述的bash或linux。例如,它没有列出为ext3文件系统定义的限制,但是linux的限制为4096(与文件系统无关)。
大卫·巴拉西奇(DavidBalažic)2014年

1
我同意您的意见:-)谢谢您指出类似的问题+1 :-)可以说这取决于FS和linux/limits.h。但是最终的答案将是这样cat /proc/sys/fs/file-max或…………getconf NAME_MAX /是的,最后一个命令是一个好命令……蒂姆在我面前发现了它。干杯
oHo 2014年


2

这与bash无关;它取决于操作系统。在Mac上,其0xff表示文件名,0x400表示路径名。Ubuntu 9的文件名限制为144个字符。

我在Wikipedia中找到了此链接。它告诉了许多文件系统的路径和文件名限制。


涉及的mac上装有HFS +,而Unix机器是ext4。
ncmathsadist,2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.