我在查找名称中包含数字的文件时偶然发现了这一点。当我输入时:
目录
*
编号*
(其中数字代表 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
文件至少可以说是令人沮丧的。
最佳答案
命令提示符处的通配符与长文件名和短“8.3”名称(如果存在)匹配。这会产生惊喜。
要查看短名称,请使用 DIR
命令的 /X
选项。
请注意,此行为在任何方面都不特定于 DIR
命令,并且当通配符在任何命令上匹配的次数超过预期时,可能会导致其他(通常是令人不快的)意外,例如 删除
。
与 *nix shell 不同,用匹配名称列表替换文件模式是在每个命令中实现的,而不是由 shell 本身实现的。这可能意味着不同的命令可以实现不同的通配符模式规则,但实际上这种情况很少见,因为 Windows 提供 API 调用来搜索目录以查找与模式匹配的文件,并且大多数程序都以明显的方式使用这些调用。对于使用“常规”工具以 C 或 C++ 编写的程序,该扩展由 C 运行时库使用 Windows API“免费”提供。
有问题的 Windows API 是 FindFirstFile()
及其近亲FindFirstFileEx()
, FindNextFile()
, 和 FindClose()
.
奇怪的是,尽管 FindFirstFile()
的文档将其 lpFileName 参数描述为“目录或路径,以及可以包含通配符的文件名,例如星号 (*
) 或问号 (?
)”,它实际上从未定义 *
和 ?
字符的含义。
文件模式的确切含义在 CP/M 中有历史记录操作系统可以追溯到 1970 年代初期,强烈影响(有些人可能会说“被直接复制”而不是这里的“影响”)MSDOS 的设计。这导致了许多“有趣”的工件和行为。 this blog post 中描述了 DOS 范围内的其中一些内容。从 2007 年开始,Raymond 准确描述了文件模式是如何在 DOS 中实现的。
关于windows - 奇怪的 Windows DIR 命令行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11107044/