我使用 Windows 系统已经很长时间了,我知道当文件和文件夹名称变得太长时,就会出现错误窗口。
当我尝试使用 SFTP 将文件从服务器备份到文件夹时发生了这种情况(例如):
D:(Windows drive partition)/Temporary/Projects/2015-06/Websites/Guitar-Site/Images/Logos/Manufacturers/Instruments/Basses/(long file name).png
如您所见,我有时倾向于构建非常指定的文件夹路径,如果文件名也很长,NTFS 可能无法以这种方式保存它。
我目前担心我的物理备份,因为备份驱动器上的文件夹路径将添加/backups/(drive name)/...
到所有文件路径。
在 ext4/Ubuntu 中是否存在这样的限制(或类似的限制)需要我注意?
答案1
文件名最大长度为 255 字节。ext4 的 wiki 页面。
最大路径为 4096 个字符。在此 Unix&Linux SE 问题中找到。
虽然我确实发现这篇维基文章在 ext4 中没有指定最大文件路径。
答案2
正如@sergiy-kolodyazhnyy 所说,最大文件名长度取决于文件系统,绝大多数将文件名长度限制为 255 字节。
他的图表中明显遗漏了光学媒体。虽然 UDF 和 Rock Ridge 扩展对文件名的限制都是 255 个字符,但不带 Rock Ridge 的 ISO9660 和 Joliet 的限制则要严格得多,如果您执行诸如备份下载之类的操作,您实际上可能会遇到这些限制youtube-dl
。
Joliet 文件名限制为 64 个 UTF-16 代码点,如果您的光盘母版制作程序可以选择以在实践中似乎不会造成任何危害的方式打破规范,则 Joliet 文件名限制为 103 个 UTF-16 代码点。
同样,如果您对规范要求不严格,则没有 Rock Ridge 扩展的 ISO 9660 级别 2 和 3 的文件名长度将被限制为 31 个字符或 37 个字符。
ISO 9660:1999,其中是受 genisoimage 支持但不受 K3b 等前端支持,限制为 207 字节(不使用 Rock Ridge)或 197 字节(使用 Rock Ridge)。
(来源:genisoimage
手册页)
至于最大路径长度,这是一个很大的误解。大多数 Linux 文件系统都没有。
有一个名为的常数PATH_MAX
,但它仅限某些 POSIX API 的最大值,您可以工作 大约。
此“路径长度不受限制”约定的唯一例外是 FAT32 和 exFAT(32,760 个 Unicode 字符)、NTFS 和 ReFS(32,767 个 Unicode 字符)、UDF(1,023 字节)和 ISO 9660(不清楚,但我见过它表示为 180、207、212 或 222 字节)。
通过运行这个小型 Python 程序然后探索生成的目录,可以轻松地演示这一点。
import os
for X in range(20):
os.mkdir('x' * 255)
os.chdir('x' * 255)
Mybash
会在提示符中显示整个路径,但会出现问题。但是zsh
,my 只会在提示符中显示当前文件夹,不会出现问题,甚至还有一个pwd
内置函数可以毫无问题地显示整个 5000+ 字节的路径。
答案3
路径名限制取决于正在使用的文件系统。jtoscarson 的回答涵盖 Ubuntu 上的默认文件系统 ext4,但是您可以在 Ubuntu 上使用各种文件系统。引用 WerkkreW 的回答在 serverfault 上,这里有一些文件系统及其限制:
BTRFS 255 bytes
exFAT 255 UTF-16 characters
ext2 255 bytes
ext3 255 bytes
ext3cow 255 bytes
ext4 255 bytes
FAT32 8.3 (255 UCS-2 code units with VFAT LFNs)
NTFS 255 characters
XFS 255 bytes
还请注意,各种文件系统对于文件名中可以出现的字符类型都有限制。例如,文件名ext4
不能包含 NULL 和/
。另请参阅 Wikipedia 文章文件系统比较。
还要注意的是,Linux 文件系统必须考虑POSIX 定义:
3.266 路径名
用于标识文件的字符串。在 IEEE Std 1003.1-2001 的上下文中,路径名最多由 {PATH_MAX} 个字节组成,包括终止空字节。它有一个可选的开头斜杠,后跟零个或多个以斜杠分隔的文件名。路径名可以可选地包含一个或多个尾部斜杠。多个连续的斜杠被视为与一个斜杠相同。
从限制.h:
{路径最大}
路径名中的最大字节数,包括终止空字符。最小可接受值:{_POSIX_PATH_MAX}
{_POSIX_PATH_MAX}
路径名中的最大字节数。值:256
答案4
我相信确定这一点最可靠的方法是使用pathconf(".", _PC_PATH_MAX);
POSIX 函数,它可以确定给定路径的最大路径。
正如函数所示,这可能因文件系统而异。
不过我不知道有哪个命令行实用程序可以公开它。这是一个最小的 C 示例:https://stackoverflow.com/questions/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c/54155296#54155296