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