区分大小写决定了在文件名或目录中,大写字母(FOO.txt)和小写字母(foo.txt)是作为区分(区分大小写)处理的,还是作为等效(不区分大小写)处理的。
区分大小写:FOO.txt ≠ foo.txt ≠ Foo.txt
不区分大小写:FOO.txt = foo.txt = Foo.txt
Windows 和 Linux 的大小写敏感性差异
使用 Linux 和 Windows 文件和目录时,可能需要调整大小写敏感性的处理方式。
标准行为:
Windows 文件系统将文件和目录名称视为不区分大小写。 FOO.txt 和 foo.txt 将被视为等效文件。
Linux 文件系统将文件和目录名称视为区分大小写。 FOO.txt 和 foo.txt 将被视为不同的文件。
Windows 文件系统支持使用每个目录的属性标志设置区分大小写。 虽然标准操作是不区分大小写的,但你可以分配一个属性标志,使目录设置为区分大小写,这样它将识别仅大小写不同的 Linux 文件和文件夹。
将驱动器装载到适用于 Linux 的 Windows 子系统(WSL)文件系统时,这尤其如此。 在 WSL 文件系统中工作时,由于运行的是 Linux,文件和目录默认情况下被视为区分大小写。
过去,如果你的文件名称只因大小写而不同,则 Windows 无法访问这些文件,因为 Windows 应用程序将文件系统视为不区分大小写,并且无法区分名称仅在大小写中不同的文件。 虽然 Windows 文件资源管理器将显示这两个文件,但无论选择哪个文件,只有一个文件将打开。
更改文件和目录的大小写敏感性
以下步骤说明如何更改 Windows 文件系统上的目录,使其具备区分大小写的功能,并识别仅因大小写不同的文件和文件夹。
某些 Windows 应用程序基于文件系统不区分大小写的假设,未使用正确的大小写来引用文件。 例如,应用程序转换文件名以使用所有大写或小写并不罕见。 在标记为区分大小写的目录中,这意味着这些应用程序无法再访问这些文件。 此外,如果 Windows 应用程序在使用区分大小写文件的目录树中创建新目录,这些目录将不再区分大小写。 这会使在区分大小写的目录中使用 Windows 工具变得困难,因此在更改 Windows 文件系统区分大小写设置时要小心。
检查当前区分大小写
若要检查 Windows 文件系统中目录是否区分大小写,请运行以下命令:
fsutil.exe file queryCaseSensitiveInfo <path>
将 <path>
替换为您的文件路径。 对于 Windows (NTFS) 文件系统中的目录, <path>
如下所示: C:\Users\user1\case-test
或者如果已在 user1
目录中,可以运行: fsutil.exe file setCaseSensitiveInfo case-test
修改区分大小写
Windows 10 内部版本 17107 开始支持每个目录区分大小写。 在 Windows 10 内部版本 17692 中,支持已更新为包括检查和修改 WSL 中目录的区分大小写标志。 使用名为 system.wsl_case_sensitive
的扩展属性来公开大小写敏感性。 对于不区分大小写的目录,此属性的值将为 0,对于区分大小写的目录为 1。
更改目录的区分大小写需要运行 更高权限 (以管理员身份运行)。 更改区分大小写标志还需要对目录具有“写入属性”、“创建文件”、“创建文件夹”和“删除子文件夹和文件”权限。
有关此问题的详细信息,请参阅故障排除部分。
若要更改 Windows 文件系统中的目录,使其区分大小写(FOO ≠ foo),请以管理员身份运行 PowerShell 并使用以下命令:
fsutil.exe file setCaseSensitiveInfo <path> enable
若要将 Windows 文件系统中的目录更改回不区分大小写的默认(FOO = foo),请以管理员身份运行 PowerShell 并使用以下命令:
fsutil.exe file setCaseSensitiveInfo <path> disable
目录必须为空,才能更改该目录上的区分大小写标志属性。 不能在包含名称仅大小写不同的文件夹或文件的目录中禁用大小写敏感性标志。
大小写敏感性继承
创建新目录时,这些目录将继承父目录的大小写敏感性。
在 WSL 1 模式下运行时,此继承策略例外。 当分发在 WSL 1 模式下运行时,不会继承每个目录区分大小写的标志;在区分大小写的目录中创建的目录本身不会自动区分大小写。 必须将每个目录显式标记为区分大小写
用于在 WSL 配置文件中装载驱动器的区分大小写选项
在使用 WSL 配置文件在适用于 Linux 的 Windows 子系统上装载驱动器时,可以管理大小写敏感性。 已安装的每个 Linux 分发版都可以有它自己的 WSL 配置文件(称为 /etc/wsl.conf
)。 有关如何装载驱动器的详细信息,请参阅 开始在 WSL 2 中装载 Linux 磁盘。
若要在装载驱动器时在 wsl.conf
文件中配置区分大小写选项,
打开将使用的 Linux 分发版(即Ubuntu)。
更改目录直到看到 etc
文件夹(这可能需要你从 cd ..
目录向上 home
)。
列出 etc
目录中的文件,以查看 wsl.conf
文件是否已存在(使用 ls
命令或使用 Windows 文件资源管理器通过 explorer.exe .
查看目录)。
wsl.conf
如果文件尚不存在,则可以使用:sudo touch wsl.conf
或通过运行sudo nano /etc/wsl.conf
来创建该文件,这将在从 Nano 编辑器保存时创建该文件。
可使用以下选项添加到 wsl.conf
文件中:
默认设置: dir
用于为每个目录启用区分大小写。
[automount]
options = case = dir
无法区分大小写(装载的 NTFS 驱动器上的所有目录都将不区分大小写):off
[automount]
options = case = off
将(NTFS)磁盘上的所有目录视为区分大小写: force
[automount]
options = case = force
此选项仅支持在作为 WSL 1 运行的 Linux 分发版上装载驱动器,并且可能需要注册密钥。 若要添加注册密钥,可以从提升的(管理员)命令提示符处使用此命令: reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\lxss /v DrvFsAllowForceCaseSensitivity /t REG_DWORD /d 1
在对文件进行任何更改 wsl.conf
后,需要重启 WSL 才能使这些更改生效。 可以使用以下命令重启 WSL: wsl --shutdown
若要装载驱动器(这些驱动器使用 DrvFs 文件系统插件,可以在 /mnt 下访问,例如 /mnt/c、/mnt/d 等),并为所有驱动器设置特定的区分大小写,请按上述说明使用 /etc/wsl.conf
。 若要为一个特定驱动器设置默认装载选项,请使用 /etc/fstab
该文件 指定这些选项。
有关更多 WSL 配置选项,请参阅 使用 wslconf 配置每个发行版启动设置。
更改装载到 WSL 分发版的驱动器上的区分大小写
默认情况下,装载到 WSL 分发版的 NTFS 格式驱动器将不区分大小写。 要更改装载到 WSL 分发版(例如 Ubuntu)的驱动器上的目录如何处理大小写,请按照与 Windows 文件系统中所列相同的步骤操作。 (默认情况下,EXT4 驱动器区分大小写)。
若要在目录(FOO ≠ foo)上启用区分大小写,请使用以下命令:
fsutil.exe file setCaseSensitiveInfo <path> enable
若要禁用目录上的区分大小写并返回到不区分大小写的默认(FOO = foo),请使用以下命令:
fsutil.exe file setCaseSensitiveInfo <path> disable
在 WSL 运行时,如果要更改已装载驱动器目录的区分大小写标志,请确保 WSL 没有链接到该目录,否则更改将不会生效。 这意味着目录不能由任何 WSL 进程打开,包括使用目录(或其后代)作为当前工作目录。
Git 版本控制系统还有一个配置设置,可用于调整正在使用的文件的区分大小写。 如果使用 Git,可能需要调整 git config core.ignorecase
设置。
若要将 Git 设置为区分大小写(FOO.txt ≠ foo.txt),请输入:
git config core.ignorecase false
若要将 Git 设置为不区分大小写(FOO.txt = foo.txt),请输入:
git config core.ignorecase true
在不区分大小写的文件系统上将此选项设置为 false 可能会导致混淆错误、错误冲突或重复文件。
有关详细信息,请参阅 Git 配置文档。
若要使用 Windows 文件系统工具处理包含混合大小写文件的 Linux 目录,您需要创建一个全新的目录并将其设置为区分大小写,然后将文件复制到该目录中(可以使用 git 克隆或解压缩)。 这些文件将保持混合大小写。 (请注意,如果已尝试将文件移动到不区分大小写的目录,并且存在冲突,则可能存在一些被覆盖且不再可用的文件。
错误:目录不为空
不能更改包含其他文件或目录的目录上的区分大小写设置。 尝试创建新目录,更改设置,然后将混合大小写文件复制到其中。
错误:访问被拒绝
确保对更改区分大小写所需的目录具有“写入属性”、“创建文件”、“创建文件夹”和“删除子文件夹和文件”权限。 若要检查这些设置,请在 Windows 文件资源管理器中打开目录(从命令行使用以下命令): explorer.exe .
右键单击目录,然后选择“ 属性 ”以打开“文档属性”窗口,然后选择“ 编辑” 以查看或更改目录的权限。
错误:此操作需要本地 NTFS 卷
区分大小写属性只能在 NTFS 格式的文件系统中的目录上设置。 默认情况下,WSL(Linux)文件系统中的目录对大小写敏感(无法通过 fsutil.exe 工具设置为不区分大小写)。
开发博客: 按目录区分大小写敏感度与 WSL
DevBlog:在 WSL 中改进了每个目录的区分大小写支持