Contents

Bash中文件名长度的限制

1.概述

在基于 Unix 的系统中,文件名的长度是有限制的。这个限制在不同的文件系统上是不同的。

在本教程中,我们将学习如何找到不同文件系统的限制。此外,我们将创建一个具有长名称的文件,以确认限制是如何工作的。

2. 文件名长度限制和 Unix 文件系统

大多数 Unix 文件系统都有类似的文件名长度限制:

文件系统 最大文件名长度
BTRFS 255 字节
exFAT 255 个 UTF-16 字符
ext2 255 字节
ext3 255 字节
ext3cow 255 字节
ext4 255 字节
FAT32 8.3(255 个带有 VFAT LFN 的 UCS-2 代码单元)
NTFS 255 个字符

但是,由于字符的 Unicode 表示可以占用几个字节,因此构成路径和文件名的最大字符数可能会有所不同。 此外,无论文件名是否包含扩展名,限制都保持不变。我们可以查看更详尽的文件名和路径限制列表 ,具体取决于文件系统。

我们还可以在我们的文件系统上使用扩展来更改最大长度限制。一个很好的例子是eCryptFS ,它利用较低文件名的一部分来保存元数据,并将文件名的限制设置为 143 个字符。

3. 找到极限

Linux 有一个名为getconf 的便捷命令,用于查询系统配置变量。

我们可以运行它来查找文件名长度限制:

$ getconf -a | grep -i name_max
NAME_MAX                           255
_POSIX_NAME_MAX                    255
LOGNAME_MAX                        256
TTY_NAME_MAX                       32
TZNAME_MAX                         
_POSIX_TZNAME_MAX                  
CHARCLASS_NAME_MAX                 2048
HOST_NAME_MAX                      64
LOGIN_NAME_MAX                     256

在这里,NAME_MAX配置代表文件名长度限制。

同样,我们可以通过修改上一条命令的最后一部分来找到路径长度限制:

$ getconf -a | grep -i path_max
PATH_MAX                           4096
_POSIX_PATH_MAX                    4096

4. 确认限制

让我们使用标准的*touch * 命令尝试创建一个名称包含 258 个字符的文件,即比 255 的限制多三个字符:

$ touch abcabcabcabcabcabcabc...other characters omitted....abcabcabc

这是我们得到的回应:

touch: cannot touch 'abcabcabcabcabcabcabc...other characters omitted....abcabcabc': File name too long