有一天,当我正在开发一个依赖于文件名方面固执己见的框架的开发项目时,我想到了这个问题。框架(此处无关)想要查看大写优先的文件名。这让我思考。
在不区分大小写的文件系统上,例如 extFAT 或 HFS+(特别是不区分大小写),文件系统如何提供对同一文件的访问两个都文件名的大写和小写版本。
例如:
$ cd ~/Documents
$ pwd
/home/derp/Documents
$ cd ../documents
$ pwd
/home/derp/documents
$ cd ../docuMents
$ pwd
/home/derp/docuMents
$ cd ../DOCUMENTS
$ pwd
/home/derp/DOCUMENTS
$ cd ../documentS
$ pwd
/home/derp/documentS
所有这些命令都将解析到同一目录。这种行为,特别是在这种情况下pwd
的函数的输出,bash
只是向我展示它认为我想看到的内容吗?
另一个例子:
$ ls ~/Documents
Derp.txt another.txt whatThe.WORLD
这里的文件系统报告由用户或程序创建的原始文件名的大小写。
文件系统堆栈中的哪个点在创建时保留了人类可读的文件名(例如,大写和小写),以便可以通过正确的大写和小写 ASCII 字符的任意组合来访问它?这只是某个地方的正则表达式技巧还是还有其他原因?
编辑:看起来我好奇的行为是在保留大小写经过更多研究后,不区分大小写的文件系统......
答案1
不区分大小写的文件系统仅意味着每当文件系统必须询问“A 是否与 B 引用相同的文件/目录?”它比较文件/目录的名称,忽略大小写差异(具体大小写差异的计数取决于文件系统 - 一旦超出 ASCII,它就不明显了)。区分大小写的文件系统不会忽略这些差异。
保留大小写的文件系统存储给定的文件名。不保留大小写的文件系统则不会;它通常会在存储之前将所有字母转换为大写(理论上,它可以使用小写,或 RaNsOm Note 大小写,或其他任何形式,但据我所知,所有现实世界中的字母都使用大写)。
您可以将这两个属性以任意组合方式组合在一起。我不确定您是否可以找到不保留大小写的区分大小写的文件系统,但您当然可以创建一个。不过,所有其他组合都存在或存在于实际系统中。
因此,保留大小写、不区分大小写的文件系统(当今最常见的不区分大小写的文件系统类型)将以您创建或最后重命名它们的任何大小写形式存储和返回文件名,但是在比较两个文件名时(以检查一个文件名是否存在)存在、打开一个、删除一个等)它将忽略大小写差异。
当您在 Unix 机器上使用不区分大小写的文件系统时,各种实用程序会执行奇怪的操作,因为 Unix 传统上使用区分大小写的文件系统,因此它们并不期望Document1
是document1
同一个文件。
在这种pwd
情况下,您看到的是默认情况下它仅输出您实际用于访问目录的路径。因此,如果您通过 到达那里cd DirName
,它将DirName
在输出中使用。如果您通过 到达那里DiRnAmE
,您将DiRnAmE
在输出中看到。 Bash 通过在环境变量中跟踪您如何到达当前目录来实现此目的$PWD
。这主要用于符号链接(如果您cd
进入符号链接,您将在您的 中看到符号链接pwd
,即使它实际上不是当前目录路径的一部分)。但它也给出了您在不区分大小写的文件系统上观察到的有些奇怪的行为。我怀疑这pwd -P
会使用存储在磁盘上的大小写为您提供目录名称,但尚未测试。