在WSL中改进每个目录的大小写敏感性支持

有了Linux的Windows子系统,我们总是允许您将文件视为大小写敏感的,就像Linux一样。在过去,如果您的文件的名称不同于case,那么这些文件不能被Windows访问,因为Windows应用程序将文件系统视为不敏感的。

有了Linux的Windows子系统,我们总是允许您将文件视为大小写敏感的,就像Linux一样。在过去,如果您的文件的名称不同于case,那么这些文件不能被Windows访问,因为Windows应用程序将文件系统视为不敏感的。

一段时间以前,我们介绍了每个目录的案例敏感性。这允许特定的目录被WSL和Windows应用程序处理为大小写敏感。因为Linux开发人员通常期望文件系统是区分大小写的,所以我们选择在默认情况下,在Windows卷宗中创建由WSL创建的新目录。

不幸的是,这产生了意想不到的副作用。一些Windows应用程序,使用文件系统大小写不敏感的假设,不要使用正确的案例来引用文件。例如,应用程序转换文件名以使用所有大写或小写字母的情况并不少见。在标记为大小写敏感的目录中,这意味着这些应用程序不能再访问文件。

虽然从长期来看,首选的解决方案是修复这些应用程序,以正确处理案例敏感的目录,但我们意识到这并不总是一个选项,而您,我们的客户,不应该等待它。

此外,如果Windows应用程序在一个目录树中创建了新的目录,在那里您使用的是大小写敏感文件,那么这些目录将不会是大小写敏感的。这使得在敏感目录下使用Windows工具变得困难。

由于这些原因,我们对案例敏感目录的工作方式做了两个更改:一个扩展属性,用于控制WSL中的大小写敏感性,以及为新目录继承大小写敏感标志。

【使用Linux扩展属性来获取和设置每个目录案例敏感性】

在Windows insider build 17692的情况下,现在可以检查和修改来自WSL内部的一个目录的大小写敏感标志。案例敏感性是使用一个名为system.wsl案例敏感的扩展属性公开的。这个属性的值对于大小写不敏感的目录来说是0,对于大小写敏感的目录是1。

为了从终端操作扩展属性,您可以使用set法塔赫和get法塔赫应用程序。在Ubuntu上,可以使用sudo apt安装attr来安装这些设备。

有了这些应用程序,您就可以使用以下方法确定目录是否具有大小写敏感性:

将目录标记为区分大小写的:

将目录标记为大小写不敏感:

下面给出了一个例子,在这个例子中,大小写不敏感的目录被标记为大小写敏感:

注意:改变大小写敏感属性需要“写属性”、“创建文件”、“创建文件夹”和“删除子文件夹和文件”权限。在某些情况下,在用户配置文件之外的文件夹中,即使您拥有目录,也可能没有所有这些权限。如果您在更改属性时收到拒绝访问的错误,请确保您在文件夹中有正确的Windows权限。

改变大小写敏感属性要求该文件夹的后代目前没有一个在WSL中打开。不可能在一个目录中禁用每个目录的大小写敏感性,这个目录中包含的文件的名称只有不同的情况。

案例敏感性属性在不支持每个目录大小写敏感的文件系统上是不可用的,比如FAT或SMB文件系统。目前,只有本地NTFS卷支持每个目录案例敏感性。

【大小写敏感性继承】

在此之前,有必要显式地将您创建的每个目录标记为大小写敏感。现在,我们已经做到了,在创建新目录时,每个目录的大小写敏感标志都是继承的。这意味着在大小写敏感的目录中创建的新目录是自动大小写敏感的。

这样做的最大好处是,在敏感的目录中使用某些Windows工具要容易得多。例如,您可以使用in-box tar。exe在一个大小写敏感的目录中提取一个存档,并确保整个目录子树是大小写敏感的。类似地,如果您使用Git为Windows克隆一个存储库,或者使用诸如Visual Studio代码之类的编辑器来创建新的目录。这使得使用带有大小写敏感目录的Windows应用程序变得更加容易,而不需要修改这些应用程序。

【在DrvFs中的案例敏感性挂载选项】

当使用DrvFs在WSL中安装Windows卷时,您可以使用case=off或case=dir mount选项指定默认的大小写敏感性行为。在case=off中,新的目录在默认情况下不是大小写敏感的。对于case=dir,它们在默认情况下是大小写敏感的。在这两种情况下,已经标记为大小写敏感的目录将被视为大小写敏感。

这些选项不是新的,而是与系统相结合的。wsl酪蛋白敏感的扩展属性和大小写敏感性继承,它们使您能够更好地控制每个目录的大小写敏感性。

现在,如果您使用case=off来安装DrvFs,那么很容易在您想要的时候标记目录大小写,并且由于继承也适用于WSL,即使是case=off,您可以确定整个子树将是大小写敏感的。

下面的例子展示了如何在大小写敏感的目录中创建的新目录也是大小写敏感的,即使在使用case=off时也是如此:

我们建议您开始使用case=off来安装DrvFs卷,并且只在需要时启用每个目录案例的敏感性。这可以通过/etc/wsl来完成。conf文件。下面是wsl的一个例子。将case=off作为自动安装的DrvFs卷的默认值:

在未来的Windows Insider构建中,如果没有指定选项,我们将改变DrvFs的默认行为,如果您想使用旧的行为,您将需要显式地挂载case=dir。

【感谢和反馈】

非常感谢帮助提供关于病例敏感性的反馈。一定要继续提供关于WSL GitHub回购的反馈,并在wslinux上发推我们。

本文翻译于:https://blogs.msdn.microsoft.com/commandline/2018/06/14/improved-per-directory-case-sensitivity-support-in-wsl/

侵删

翻译不易,转载请注明