以下问题仅适用于 bash 和 linux:
- 文件的绝对路径名中的字符数是否有限制?
- 文件名(无扩展名)的字符数是否有限制?
如果是这样,这些限制可能是什么?如果它们是系统特定的,我如何访问它们?
这在很大程度上取决于文件系统。对于 ext FS(目前在 Linux 上使用最多):
扩展名不是 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 上,文件名和路径名长度取决于:
linux/limits.h
正如Michael Aaron Safyan和后来的David Balažic 所述,在编译前定义的常量也指出了类似的问题。要在bash中动态获取这些属性:
- 文件的绝对路径名中的字符数是否有限制?
就在这里。
请参阅sfp对 Linux 上的文件名长度限制问题的回答?关于服务器故障
简而言之:
#define PATH_MAX 4096 /* # chars in a path name including nul */
对于:
- 文件名(无扩展名)的字符数是否有限制?
在同一个链接的答案中:
#define NAME_MAX 255 /* # chars in a file name */
仅供参考,在 Docker 上,文件名限制当前为242 个字符。
这取决于使用的文件系统。例如,ext4 的最大文件名长度为 256 字节,路径名长度不受限制。
有关更多信息,请参阅文件系统比较。
这不依赖于 bash;它取决于操作系统。在 Mac 上,文件名的 0xff 和路径名的 0x400 左右。Ubuntu 9 的文件名限制为 144 个字符。
我在Wikipedia中找到了这个链接。它告诉许多文件系统的路径和文件名限制。