调整区分大小写

区分大小写确定在文件名或目录中是将大写 (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 文件中配置区分大小写选项:

  1. 打开将要使用的 Linux 发行版(即 Ubuntu)。
  2. 更改目录,直至看到 etc 文件夹(这可能需要从 home 目录 cd ..)。
  3. 列出 etc 目录中的文件,查看 wsl.conf 文件是否已存在(使用 ls 命令,或使用 explorer.exe . 通过 Windows 文件资源管理器查看目录)。
  4. 如果 wsl.conf 文件尚不存在,则可以使用 sudo touch wsl.conf 或通过运行 sudo nano /etc/wsl.conf 创建它,后者将在从 Nano 编辑器保存时创建该文件。
  5. 可以将以下选项添加到 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,则可能需要调整 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 FS 工具无法识别这些文件

若要使用 Windows 文件系统工具处理包含混合大小写文件的 Linux 目录,需要创建一个全新的目录并将其设置为区分大小写,然后将这些文件复制到该目录中(使用 git clone 或 untar)。 这些文件仍使用的是混合大小写。 (请注意,如果已尝试将文件移动到不区分大小写的目录,并且存在冲突,则很可能某些文件已被覆盖且不再可用。)

错误:目录不为空

不能更改包含其他文件或目录的目录上的区分大小写设置。 尝试创建一个新目录,更改设置,然后将混合大小写文件复制到该目录中。

错误:访问被拒绝

确保在需要更改区分大小写的目录上具有“写入属性”、“创建文件”、“创建文件夹”和“删除子文件夹和文件”权限。 若要检查这些设置,请在 Windows 文件资源管理器中打开该目录(从命令行,使用命令:explorer.exe .)。 右键单击该目录,并选择“属性”以打开“文档属性”窗口,然后选择“编辑”以查看或更改目录的权限

Properties windows to view or change permissions on NTFS directories

错误:此操作需要本地 NTFS 卷

只能在 NTFS 格式的文件系统中的目录上设置区分大小写属性。 默认情况下,WSL (Linux) 文件系统中的目录区分大小写(不能使用 fsutil.exe 工具设置为不区分大小写)。

其他资源