18

我在查找名称中带有数字的文件时偶然发现了这一点。当我输入:

dir *数字*

(其中 number 表示从 0 到 9 的任何数字,星号和数字之间没有空格)

在 cmd.exe 命令提示符下,它会返回各种文件中未出现的任何文件以符合搜索条件。奇怪的是,根据目录,一些数字会起作用,而其他数字则不起作用。例如,在与网站关联的目录中,我键入以下内容:

dir *4*

返回的是:

C:\Ampps\www\includes\pages 目录

2012 年 4 月 30 日下午 03:55 153 inventory_list_retrieve.php
2012 年 6 月 18 日上午 11:17 6,756 ix.html
2012 年 6 月 19 日下午 1:47 257,501 jquery.1.7.1.js
               3 个文件 264,410 字节
               0 Dir(s) 362,280,906,752 字节空闲

这对我来说没有任何意义。有什么线索吗?

这个问题是在 stackOverflow 上提出的,因为 DIR 命令在批处理程序中经常与 FOR 结合使用。如果使用 DIR 命令,奇怪的 DIR 行为似乎会使批处理程序可能不可靠。

编辑:(附加说明)。虽然已经过去了很长时间,但我发现了另一个怪癖,这几乎让我付出了很多工作。我想删除.htm特定目录树中的所有文件。我在做之前意识到它也*.htm匹配.html文件。此外,*.manmatches .manifest,可能还有其他。至少可以说,删除.html该特定目录中的所有文件会令人不快。

4

4 回答 4

17

命令提示符处的通配符与长文件名和短“8.3”名称(如果存在)匹配。这会产生惊喜。

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

请注意,此行为不以任何方式特定于DIR命令,并且当通配符与任何命令(例如DEL.

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

有问题的 Windows API 是FindFirstFile()及其近亲FindFirstFileEx(),FindNextFile()FindClose().

奇怪的是,尽管文档FindFirstFile()将其 lpFileName 参数描述为“目录或路径,以及可以包含通配符的文件名,例如星号 ( *) 或问号 ( ?)”,但它从未真正定义*?字符的含义.

文件模式的确切含义在 1970 年代早期的CP/M操作系统中已有历史,它强烈影响了 MSDOS 的设计(有些人可能会说“直接复制”而不是“影响”)。这导致了许多“有趣的”工件和行为。在 2007 年的这篇博客文章中描述了 DOS 端的一些内容,其中 Raymond 准确地描述了文件模式是如何在 DOS 中实现的。

于 2012-06-19T19:08:34.603 回答
13

是的。如果您尝试以下操作,您会看到它还会搜索短名称:

dir /x *4*

(/x 开关用于短名称)

过滤文件名使用:

dir /b | find "4"
于 2012-06-19T19:00:06.527 回答
5

引用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。

于 2012-06-19T19:34:19.100 回答
4

似乎 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字符。

/X当我将switch 与 dir 命令一起使用时,一切都变得清晰起来,这使得 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.
于 2012-06-19T19:08:18.287 回答