在bash中限制文件名的长度

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

  1. 文件的绝对path名中的字符数是否有限制?
  2. 文件名(不带扩展名)的字符数是否有限制?

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

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

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

该扩展不是FS所知道的,它包含255个字节(包含扩展名(没有任何扩展名的文件名))。

根据FS, 这是一个更详尽的限制列表。

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

在临时目录中,运行:

 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。

在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 

我提到其他答案,请注意他们。

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

  • eugene y和ncmathsadist指出的文件系统限制 ;
  • 如Michael Aaron Safyan和后来的DavidBalažic所述,在编译之前在linux/limits.h定义了一个类似的问题 。

要在bash中dynamic获取这些属性:

  • 创build一个文件名(或path名)越来越长,正如解释所说的那样
  • 使用tim提供的getconf命令,该命令在Linux上也可用:

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

Single UNIX Specification中提到了limits.h中的NAME_MAXPATH_MAX常量,这些常量可以用pathconf读取。 但是,这是非常依赖文件系统,你不可能达到这样的限制。

注意:作为程序员,您不应该硬编码这些限制。 你应该使用dynamic分配,只要底层系统允许你做任何事情,它就会一直工作。

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

就在这里。

在问题文件名长度限制在linux上看到由SFC的答案 ? 在服务器故障

简而言之:

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

并为:

  1. 文件名(不带扩展名)的字符数是否有限制?

在相同的链接答案:

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

这取决于使用的文件系统。 例如,ext4的最大文件名长度为256字节,path名的长度不受限制。

请参阅比较文件系统了解更多。

这不是bash相关的; 这取决于操作系统。 在Mac上,它的0xff为一个文件名和0x400左右的path名称。 Ubuntu 9的文件名限制为144个字符。

我在维基百科find了这个链接。 它告诉大量文件系统的path和文件名限制。

仅供参考,在Docker上,文件名限制目前是242个字符 。