我在寻找名称中带有数字的文件时偶然发现了这一点。当我输入:
dir
*
号码 *
(其中number表示0到9之间的任何数字,星号和数字之间没有空格)
在cmd.exe命令提示符下,它返回任何不符合搜索条件的文件。有点奇怪的是,取决于目录,一些数字将起作用,而不是其他数字。例如,在与网站关联的目录中,我键入以下内容:
dir *4*
返回的是:
Directory of C:\Ampps\www\includes\pages 04/30/2012 03:55 PM 153 inventory_list_retrieve.php 06/18/2012 11:17 AM 6,756 ix.html 06/19/2012 01:47 PM 257,501 jquery.1.7.1.js 3 File(s) 264,410 bytes 0 Dir(s) 362,280,906,752 bytes free
这对我没有任何意义。任何线索?
问题出在stackOverflow上,因为DIR命令通常与批处理程序中的FOR结合使用。如果使用DIR命令,奇怪的DIR行为似乎会使批处理程序可能不可靠。
编辑:(附加说明)。虽然已经过了很长时间,但我发现了另一个怪癖,这几乎让我付出了很多努力。我想删除特定目录树中的所有.htm
个文件。我之前意识到*.htm
匹配.html
文件。此外,*.man
匹配.manifest
,可能还有其他人。删除该特定目录中的所有.html
文件至少可以说是令人沮丧。
答案 0 :(得分:15)
命令提示符处的通配符与长文件名和短“8.3”名称匹配(如果存在)。这会产生意外。
要查看短名称,请使用/X
命令的DIR
选项。
请注意,此行为与DIR
命令无关,并且当外卡与任何命令(例如{{1})匹配超过预期时,可能会导致其他(通常令人不愉快的)意外}。
与* nix shell不同,在每个命令中实现用匹配名称列表替换文件模式,而不是由shell本身实现。这可能意味着不同的命令可以实现不同的通配符模式规则,但实际上这是非常罕见的,因为Windows提供API调用来搜索目录中与模式匹配的文件,并且大多数程序以明显的方式使用这些调用。对于使用“常用”工具用C或C ++编写的程序,C运行时库使用Windows API“免费”提供该扩展。
有问题的Windows API是FindFirstFile()
及其近亲FindFirstFileEx()
,FindNextFile()
和FindClose()
。
奇怪的是,虽然DEL
的文档将其lpFileName参数描述为“目录或路径,文件名可以包含通配符,例如,星号(FindFirstFile()
)或问题标记(*
)“它实际上从未定义?
和*
字符的含义。
文件模式的确切含义在20世纪70年代早期的CP/M操作系统中具有历史记录,强烈影响(有些人可能会说“直接复制”代替“受影响”)MSDOS的设计。这导致了许多“有趣的”工件和行为。从2007年的this blog post开始描述其中一些在频谱的DOS端,Raymond详细描述了如何在DOS中实现文件模式。
答案 1 :(得分:12)
是的。如果您尝试这样做,您会看到它还会搜索短名称:
dir /x *4*
(/ x开关用于短名称)
用于过滤文件名:
dir /b | find "4"
答案 2 :(得分:4)
RBerteig的回答引用:
请注意,此行为绝不是DIR命令特有的, 当外卡时,可能导致其他(通常令人不愉快的)惊喜 在任何命令上匹配超过预期,例如DEL。
即使FOR命令也是如此,这是非常讨厌的。
for %A in (*4*) do @echo %A contains a 4
还将搜索短名称。解决方案是再次使用FIND或FINDSTR以更可靠的方式过滤掉名称。
for %A in (*) do @echo %A | >nul findstr 4 && echo %A contains a 4
注意 - 如果在批处理文件中使用该命令,请将%A更改为%% A.
将FOR与FINDSTR结合使用可以是一种通用方法,可以安全地使用任何遇到短文件名问题的命令。只需用问题命令替换ECHO,例如COPY或DEL。
答案 3 :(得分:3)
似乎dir命令搜索也是简短的(8.3方式)文件名。
当我致电dir *1*
时,这就是我得到的:
Volume in drive C is System
Volume Serial Number is F061-0B78
Directory of C:\Users\Piotrek\Desktop\Downloads
2012-05-20 17:33 23 639 040 gDEBugger-5_8.msi
2012-05-20 17:30 761 942 glew-1.7.0.zip
2012-05-20 17:11 9 330 176 irfanview_plugins_433_setup.exe
2012-05-24 20:17 4 419 192 SumatraPDF-2.1.1-install.exe
2012-05-15 22:55 3 466 248 TrueCrypt Setup 7.1a.exe
5 File(s) 1 127 302 494 bytes
列出的文件中有gDEBugger-5_8.msi
个文件,其中显然没有1
个字符。
当我使用dir命令使用/X
开关时,一切都变得清晰,这使得dir使用8.3文件名。 dir /X *1*
命令的输出:
Volume in drive C is System
Volume Serial Number is F061-0B78
Directory of C:\Users\Piotrek\Desktop\Downloads
2012-05-20 17:33 23 639 040 GDEBUG~1.MSI gDEBugger-5_8.msi
2012-05-20 17:30 761 942 GLEW-1~1.ZIP glew-1.7.0.zip
2012-05-20 17:11 9 330 176 IRFANV~1.EXE irfanview_plugins_433_setup.exe
2012-05-24 20:17 4 419 192 SUMATR~1.EXE SumatraPDF-2.1.1-install.exe
2012-05-15 22:55 3 466 248 TRUECR~1.EXE TrueCrypt Setup 7.1a.exe
5 File(s) 1 127 302 494 bytes
引用dir的帮助:
/X This displays the short names generated for non-8dot3 file
names. The format is that of /N with the short name inserted
before the long name. If no short name is present, blanks are
displayed in its place.