2012-06-19 57 views
15

我在名称中查找带有数字的文件时意外地发现了这个问题。当I型:奇怪的Windows DIR命令行为

dir**

(其中数字表示任何数目的从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匹配,并可能有其他人。删除该特定目录中的所有.html文件将会令人不安。

+1

有趣!我们需要对此事做一些测试... – Aacini

+0

哇,这些年过去了 - 仍然为这项技术所惊叹。我可以证实这种奇怪的行为。 – Helbreder

+0

http://superuser.com/questions/336358/is-it-a-good-idea-to-disable-short-filenames-on-windows-7-running-on-a-ssd-drive –

回答

14

野生卡对阵双方长文件名和短匹配“8.3”名称(如果存在) 。这可能会产生惊喜。

要查看短名称,请使用DIR命令的/X选项。

注意,这种行为是不特定于DIR命令的任何方式,并可能导致其他的(通常不愉快)当一个通配符匹配超过预期的任何命令的惊喜,如DEL

与* nix shell不同,用匹配名称列表替换文件模式是在每个命令中实现的,而不是由shell本身实现的。这可能意味着不同的命令可以实现不同的通配符模式规则,但实际上这很罕见,因为Windows提供了API调用来搜索与目录匹配的文件的目录,而大多数程序以明显的方式使用这些调用。对于使用“常用”工具以C或C++编写的程序,该扩展是由C运行时库使用Windows API“免费”提供的。

所述的Windows API是FindFirstFile()及其近亲FindFirstFileEx()FindNextFile()FindClose()

奇怪的是,尽管对于FindFirstFile()的文档描述了它的lpFileName的对象参数作为“目录或路径,和文件名,它可以包括通配符,例如,一个星号(*)或问号(?)”它从未实际上定义了*?字符的含义。

文件模式的确切含义在1970年代早期的操作系统CP/M中有历史记录,这些操作系统对MSDOS的设计产生了强烈影响(有些人可能会说“被直接复制”而不是“影响到”)。这导致了一些“有趣的”工件和行为。其中一些在DOS的末端描述于2007年的this blog post,其中Raymond准确地描述了DOS中如何实现文件模式。

11

是的。你会看到,它也通过搜索短名称,如果你试试这个:

dir /x *4* 

(/ x开关是短名称)

用于过滤文件名使用:

dir /b | find "4" 
+1

如果您只想在长名称中使用搜索|找到 – npocmaka

+1

+1,是的,“隐藏的”短文件名可能会导致不明显的问题。使用FIND的建议应该工作:'dir/b |找到“4”。 FINDSTR的使用将允许通过正则表达式进行更多的选择性过滤。 – dbenham

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*命令的输出:dir命令的帮助

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 

引用:在命令提示符下

/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. 
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至%%如果使用批处理文件中的命令的一个。

将FOR和FINDSTR结合起来可以成为一种通用的方法,以安全地使用任何遇到短文件名的问题的命令。只需用问题命令(如COPY或DEL)替换ECHO即可。