WinXP dir 命令:3 和 4 个字符扩展名相同吗?

WinXP dir 命令:3 和 4 个字符扩展名相同吗?

.asp我正在尝试使用以下命令递归搜索目录树以查找所有文件:

dir *.asp /s

由于某种原因,这不仅返回 asp 文件,还返回 aspx 文件。

我怎样才能强制它忽略 aspx 文件?

答案1

dir /x

出于兼容性原因,Windows 生成8.3 名称FindFirstFile()对于创建的每个长文件名,并检查通配符匹配代码 (两个都原始名称和缩写名称。用于dir /x查看分配给每个文件的缩写名称。

8.3 名称的“扩展”部分是总是只需将最后一个扩展名截断为最多 3 个字符即可创建.aspx.ASP


使用 NTFS 文件系统时,8.3 名称创建可以使用以下方法在系统范围内禁用:

fsutil behavior set disable8dot3

但这不会影响现存的名字。你必须重命名每个文件然后将其重命名回原来的名字。


也可以看看:Windows 命令提示符中的目录搜索显示不正确的输出!

答案2

当然,这取决于所DIR使用的命令解释器的命令。DIRTake Command 中的命令, 例如,默认仅匹配长名称所以不会表现出这种行为。(可以启用短名称和长名称的匹配为了与 CMD 的DIR命令兼容。)所以有解决这个问题的方法不需要FSUTIL管理员权限。

答案3

有趣——似乎是一个错误……

考虑到,我会像这样通过 find 进行管道传输:

dir /s *.asp | find /i /v ".aspx "

答案4

作为用户重力已经说过他们的答案,这是因为通配符所使用的cmd内部命令和几个外部命令也匹配8.3 文件名,默认情况下处于启用状态。

为了解决这个问题,有几种方法,我想向您展示其中一些:


您可以使用findstr过滤返回的文件名dir

dir /S /B /A:-D "*.asp" | findstr /IEC:".asp"

这甚至不匹配.asp名称中包含某处的文件(如file.asp.aspx),也不排除.aspx名称中包含的文件(如file.aspx.asp)。

该开关/Bdir返回纯文件名/路径列表,可进行适当过滤。该选项/A:-D排除任何匹配的目录。


或者,where命令可以使用,其处理通配符的方式与以下方式不同dir

where /R "." "*.asp"

缺点是这个命令还会考虑PATHEXT变量的内容,因此它也会匹配以 结尾的文件.asp.exe,因为.EXE包含在 中PATHEXT;为了避免这种情况,您可以暂时清除PATHEXT变量(通过set "PATHEXT_BACKUP=%PATHEXT%" & set "PATHEXT=")并稍后恢复它(通过set "PATHEXT=%PATHEXT_BACKUP%" & set "PATHEXT_BACKUP=")。


这个答案按用户康拉德展示了一种更改创建扩展名超过 3 个字符的项目的 8.3 文件名的默认行为的方法,这反过来可以防止大多数此类意外匹配。但不幸的是,这不会改变任何当前的 8.3 文件名。当然,理论上可能存在 8.3 文件名仍然匹配的情况,尽管这种情况不太可能发生。

我必须承认我还没有测试过这个......

相关内容