在 Windows 7 上,我有一个包含以下四个文件的目录:
- xxx.txt
- xxx.txt2
- xxx2.txt
- xxx2.txt2
由于文件扩展名超过 3 个字符,因此通配符 * 的行为似乎很奇怪:
dir *.txt
10/13/2014 04:14 PM 6 xxx.txt
10/13/2014 04:17 PM 6 xxx2.txt
10/13/2014 04:17 PM 6 xxx2.txt2
10/13/2014 04:14 PM 6 xxx.txt2
4 File(s) 24 bytes
0 Dir(s) 6,660,980,736 bytes free
我希望只看到两个带有 txt 扩展名的文件,而不是带有 txt2 的文件(就像在 Linux 机器上一样)。MS-DOS 会忽略将文件扩展名截断为 3 个字符还是会自动在末尾添加另一个通配符?如果我只想删除带有 txt 扩展名的文件而不删除带有 txt2 的文件,我应该使用哪个命令?谢谢
答案1
你没有使用 MS-DOS;它甚至不允许文件扩展名长度超过 3 个字符。您使用的是 Windows 命令行 –cmd.exe
具体来说,是 shell。
但 Windows 确实努力与那个时代的程序保持兼容。因此,直到 Windows 8(或类似版本)之前,所有带有较长扩展名的文件都有一个别名,该别名的扩展名和名称本身都被截断了。
如果您运行dir /x
,您可能会看到每个文件都分配有一个“短名称”,该名称限制为 8+3 个字符,就像在 MS-DOS 和 16 位 Windows 中一样。
这些名称的存在是为了防止用户想要升级到 Windows 95 但仍然通过最初为 Windows 3.1 编写的程序访问他们的文件 - 因此运行 16 位程序不会崩溃,而只会显示C:\PROGRA~1
和C:\MYDOCU~1\CALENDAR.TXT
而不是C:\Program Files
和C:\My Documents\Calendar.txt
。
(是的,即使在 Windows XP/Vista 时代,有些人确实使用旧的 16 位软件……不过,我很确定 Windows 8 默认关闭了“短名称”。这可能是为什么 @EBGreen 没有看到相同的“问题”……)
另一件需要考虑的事情是,旧的 Windows shellcmd.exe
本身已经出现了不少怪癖和兼容性修复。例如,由于 MS-DOS 匹配文件名的方式,dir .txt
意味着与 相同dir *.txt
,尽管这不是故意的。但人们已经习惯了更短的语法,尽管 Windows 操作系统本身不再将其视为.txt
通配符,cmd.exe
仍然接受该语法. (该dir
命令本身不是一个程序,而是内置于 shell 中。)
(类似地,在链接的文章中,描述了另一个通配符怪癖——Windows 文件名可以有不扩展名,但人们确实习惯于输入*.*
,因此它的含义与 相同,*
并且单个点被忽略。)
答案2
我无法告诉你为什么它会这样工作。这很奇怪。我可以告诉你的是,Powershell(你应该在机器上安装它)的工作方式与你预期的一样。在 powershell 中:
PS I:\temp\test> ls
Directory: I:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 10/13/2014 9:29 AM 3 bar.txt
-a--- 10/13/2014 9:29 AM 3 bar.txt2
-a--- 10/13/2014 9:29 AM 3 foo.txt
-a--- 10/13/2014 9:29 AM 3 foo.txt2
PS I:\temp\test> ls *.txt
Directory: I:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 10/13/2014 9:29 AM 3 bar.txt
-a--- 10/13/2014 9:29 AM 3 foo.txt
答案3
grawity 正确地识别出该行为源于短文件名。文件掩码与长名称和短名称都进行了比较。
有关通配符如何与文件名匹配的完整规则,请参阅“源掩码”部分Windows RENAME 命令如何解释通配符?
您可以通过管道传输到 FINDSTR 来获得所需的 DIR 结果:
dir *.txt* | findstr /vrix "[0-9].*\.txt[^.][^.]*"
答案4
正如其他人指出的那样,这是关于短文件名生成的。但请注意,这不是系统范围的设置。每个卷可能不同。我注意到我的机器上的行为因驱动器而异。事实上,我的C:
驱动器启用了短名称生成,而D:
驱动器关闭了它。您可以使用fsutil 8dot3name
命令(作为管理员)。
C:\>dir *.txt
Volume in drive C is Windows
Volume Serial Number is EC1B-17C1
Directory of C:\
28.08.2023 10:25 10 foo.txt
28.08.2023 10:25 11 FOO~1.TXT foo.txt2
2 File(s) 21 bytes
0 Dir(s) 36 329 230 336 bytes free
C:\>fsutil 8dot3name query C:
The volume state is: 0 (8dot3 name creation is enabled).
The registry state is: 2 (Per volume setting - the default).
Based on the above settings, 8dot3 name creation is enabled on C:
C:\>D:
D:\>dir *.txt
Volume in drive D is Data
Volume Serial Number is EFFC-CC70
Directory of D:\
28.08.2023 10:25 10 foo.txt
1 File(s) 10 bytes
0 Dir(s) 309 316 231 168 bytes free
D:\>fsutil 8dot3name query D:
The volume state is: 1 (8dot3 name creation is disabled).
The registry state is: 2 (Per volume setting - the default).
Based on the above settings, 8dot3 name creation is disabled on D: