包含扩展名的 DIR 文件名

Syn*_*ech 5 dir

我只是想检查转储目录中是否有任何 ZIP 程序(如 PeaZip、NanoZip 等),但遇到了一个我以前只见过几次的奇怪问题。

我用下面的命令列表文件,其文件名包含zip(例如nanozip.zippeazip2.rarwinzip-beta.exe等):

dir *zip*
Run Code Online (Sandbox Code Playgroud)

这列出了文件名包含的所有文件zip,但也列出了所有带有.zip扩展名(例如,foobar.zip)的文件。

然后我尝试了以下方法:

dir *zip*.*
Run Code Online (Sandbox Code Playgroud)

这给出了相同的结果。

有谁知道获得预期结果的方法?(我知道for 可能可以做到,但输出将不正确。)

Den*_*nis 2

问题

列出基本名称中包含的所有文件zip(最后一个点之前,如果有的话)是很棘手的,原因有两个:

  • Windows 只有两个通配符:*?

    *匹配任意数量的字符(包括零)。

    ?精确匹配一个字符(点除外),除非它是模式的最后一个字符,后跟一个点、仅其他通配符或仅其他通配符后跟一个点。1

  • 长文件名中没有实际的扩展名。GUI 可能会将最后一个点后面的所有内容视为文件扩展名,但这只是一种约定。

    更糟糕的是,.它在命令提示符上有特殊含义。在 LFN 之前,每个文件都有一个扩展名(尽管它可能为空)。因此,*.*匹配所有文件,而*仅匹配扩展名为空的文件。

    为了保持一定的向后兼容性,.如果后面仅跟有通配符和其他点,则将被忽略,除非这些点相邻且后面至少有一个通配符,或者根本没有通配符且点之前最多有一个星号。1

例子:

  • foo?.bar将匹配 file foo.bar,但foo?bar不会匹配foobarfoo.bar

  • **.**.*.*.*.***.将匹配任何给定文件夹中的所有文件,而*.*..和 则*..*不会。

解决方法

除非您使用存档位来执行增量备份2,否则有一种方法可以仅使用 DIR 和ATTRIB命令来显示您感兴趣的文件(并且仅显示这些文件)。

脚步:

  1. zip首先,对包含各自文件名中任意位置的所有文件设置存档位:

     ATTRIB +A *zip*
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在,取消设置所有具有扩展名的文件的存档位zip

     ATTRIB -A *.zip
    
    Run Code Online (Sandbox Code Playgroud)

    如果您想排除相应扩展名zip也以 结尾的文件(例如ezip),请改用以下命令:

     ATTRIB -A *.*zip
    
    Run Code Online (Sandbox Code Playgroud)

    由于*.*zip还将针对 8.3 文件名进行测试,因此这也将匹配相应扩展名以zip(例如zipx)开头的文件,除非 8.3 文件名不存在或已被更改。

  3. 由于上一个命令取消了诸如 之类的文件的存档位nanozip.zip,因此重置这些文件:

     ATTRIB +A *zip*.*zip
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在,您可以使用/AADIR 命令的开关来仅显示具有设置归档位的文件:

     DIR /AA *zip*
    
    Run Code Online (Sandbox Code Playgroud)

通过/SDIR 开关和/S [/D]ATTRIB 开关,这甚至适用于子目录中的文件。


1这是一个怪癖列表,而不是对通配符行为的详尽解释。

2例如, Windows XP 的NTBackup尊重存档位。