不幸的是,我需要时不时地使用 cmd.exe,而且它通常不会给我带来太多困扰,除非我在 vim 中编辑文件,然后尝试使用制表符补全来运行该文件。
foo.py
如果我在 vim 中打开该文件,.foo.py.swp
则该文件也存在于目录中。我看到的行为是:
C:\foo> f[TAB]
C:\foo> .foo.py.swp[TAB]
C:\foo> foo.py
这真是令人恼火,我想知道除了彻底解决问题(例如更改交换文件命名或使用 PowerShell)之外,是否有其他方法可以防止此行为。我确实注意到 PowerShell 不会模拟此行为,但我真的不想使用它。
答案1
如果您仔细考虑一下,Windows 的行为就完全符合您的预期(说实话,在看到您的问题之前,我并没有完全考虑清楚)。以“.”开头的文件名被视为具有扩展名的空文件名文件。要了解其工作原理,请创建一个目录,然后使用touch
(我假设您熟悉touch
)创建以下文件:
touch .a.aaa
touch a.aaa
touch .b.bbb
touch b.bbb
现在,在该目录中,使用tab键循环浏览文件,您将看到顺序为:
.a.aaa
.b.bbb
a.aaa
b.bbb
如果您想要浏览“a”个文件,那么在之前输入“a” tab,您就会得到一个可预测的.a.aaa
,a.aaa
。
至于_文件名中的字符,它就像任何其他字符一样,排在“Z”之后。
答案2
FindFirstFile 的语义(CMD 用它来枚举匹配的文件)意味着模式会根据长文件名(您希望看到的)以及自动生成的“8.3”文件名进行测试。短名称生成是导致您产生虚假匹配的原因。
您可以通过 FSUTIL 禁用 8.3 生成,但这会停止进一步生成,并且不会删除已经存在的名称。您必须运行一个可以重命名的脚本才能完全删除它们。
然而,这很危险,因为有些程序毫无头绪,会把自动生成的短名称记下来(比如你使用的是 16 位安装程序,比如旧版本的 MSOFFICE)。如果你禁用它们的生成,那么这些安装程序可能会失败。