扩展名超过 3 个字符的文件的 Windows 通配符

扩展名超过 3 个字符的文件的 Windows 通配符

在 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~1C:\MYDOCU~1\CALENDAR.TXT而不是C:\Program FilesC:\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:

相关内容