我注意到,当在 Windows 命令行中使用 DIR 时,对于一种特定情况,通配符无法按我的预期运行。示例:
dir *.doc
运行类似于
dir *.doc*
我仅在通配符目录位于句点之前时才注意到此行为(这是一种重要且常见的情况)。更奇怪的是,如果您运行以下任一命令:
dir *.d
dir *.do
它将按预期执行。只有当你点击 3 个字符扩展时,奇怪的行为才会开始。我提到它的运行类似于上面的命令,因为如果 *.不是扩展名,它将不会返回文件。例如:
dir *.tar
将不会返回file.tar.gz,但将返回file.targa
为什么会出现这种情况以及如何避免?
最佳答案
DIR 命令与长名称和短名称相匹配。
不符合旧 8.3 DOS 标准的 Windows 文件名会自动获得一个符合标准的短文件名别名。 (可以在 NTFS 驱动器上禁用此功能)
例如,在我的本地硬盘上,名称为“file.targa”的文件被分配了一个短名称“file~1.tar”。短名称的规则没有记录,分配的名称会根据创建文件时文件夹中已存在的名称而有所不同。但有一点是一致的,即长扩展名会被截断为长扩展名的前三个字符。
鉴于 DIR 搜索长名称和短名称,您现在可以看到“*.tar”与“file~1.tar”匹配,这是“file.targa”的短名称
几乎每个使用通配 rune 件掩码执行的命令都存在此问题,包括 FOR、COPY、MOVE、REN 等。
解决方法
如果您的卷是 NTFS,那么您(或您的管理员)可以禁用短名称。但现有的短名称仍然存在,它只会禁用为 future 文件生成短名称。这不是一个非常实用的解决方案,因为您可能无法知道是否存在任何短文件名。
如果您只需要一个文件列表,而不需要其他 DIR 信息,那么您可以通过 FINDSTR 管道传输 DIR/B 的结果以获得所需的结果。
dir /b *.tar | findstr /le ".tar"
关于batch-file - 命令提示符中通配符和 DIR 命令的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29087611/