111*_*--- 13 filesystems filenames case-sensitivity
前几天,当我从事一个依赖于关于文件名的自以为是的框架的开发项目时,我想到了这个问题。该框架(此处无关)希望看到大写优先的文件名。这让我思考。
上不区分大小写的文件系统,说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
Run Code Online (Sandbox Code Playgroud)
所有这些命令都将解析到同一目录。这种行为,特别pwd
是bash
在这种情况下只是一个函数的输出只是向我展示了它认为我想看到的东西吗?
另一个例子:
$ ls ~/Documents
Derp.txt another.txt whatThe.WORLD
Run Code Online (Sandbox Code Playgroud)
此处的文件系统报告由用户或程序创建的原始文件名的大小写。
文件系统堆栈中的哪个点是人类可读的文件名在创建时保留(例如大写和小写),以便可以通过正确的大写和小写 ASCII 字符的任意组合访问它?这只是某个地方的正则表达式技巧还是有其他事情发生?
编辑:它看起来像我很好奇中发现的行为的情况下保留后一些调查研究不区分大小写的文件系统......
der*_*ert 15
不区分大小写的文件系统仅意味着每当文件系统必须询问“A 是否与 B 引用相同的文件/目录?” 它比较文件/目录的名称,忽略大写/小写的差异(确切地说,大写/小写差异的数量取决于文件系统——一旦你超越了 ASCII,它就变得不明显了)。区分大小写的文件系统不会忽略这些差异。
保留大小写的文件系统存储给定的文件名。非大小写保留文件系统没有;它通常会在存储之前将所有字母转换为大写(理论上,它可以使用小写字母、RaNsOm Note 大小写或其他任何字母,但 AFAIK 所有现实世界的字母都使用大写字母)。
您可以将这两个属性以任意组合方式放在一起。我不确定您是否可以找到不保留大小写的区分大小写的文件系统,但您当然可以创建一个。但是,所有其他组合都存在或存在于真实系统中。
因此,一个保留大小写、不区分大小写的文件系统(当今最常见的不区分大小写的文件系统类型)将以您创建或上次重命名它们的任何大小写形式存储和返回文件名,但是当比较两个文件名时(检查一个存在,打开一个,删除一个,等等)它会忽略大小写差异。
当你在 Unix 机器上使用不区分大小写的文件系统时,各种实用程序会做一些奇怪的事情,因为 Unix 传统上使用区分大小写的文件系统——所以它们不期望Document1
并且document1
是同一个文件。
在这种pwd
情况下,您看到的是默认情况下它只输出您实际用于访问目录的路径。因此,如果您通过 到达那里cd DirName
,它将DirName
在输出中使用。如果您通过 到达那里DiRnAmE
,您将DiRnAmE
在输出中看到。Bash 通过跟踪您如何到达$PWD
环境变量中的当前目录来做到这一点。这主要是用于符号链接(如果您cd
使用符号链接,您将在 中看到符号链接pwd
,即使它实际上不是当前目录路径的一部分)。但它也提供了您在不区分大小写的文件系统上观察到的有些奇怪的行为。我怀疑这pwd -P
会使用存储在磁盘上的案例为您提供目录名称,但尚未测试。