我只是想检查转储目录中是否有任何 ZIP 程序(如 PeaZip、NanoZip 等),但遇到了一个我以前只见过几次的奇怪问题。
我用下面的命令列表文件,其文件名包含zip(例如nanozip.zip,peazip2.rar,winzip-beta.exe等):
dir *zip*
Run Code Online (Sandbox Code Playgroud)
这列出了文件名包含的所有文件zip,但也列出了所有带有.zip扩展名(例如,foobar.zip)的文件。
然后我尝试了以下方法:
dir *zip*.*
Run Code Online (Sandbox Code Playgroud)
这给出了相同的结果。
有谁知道获得预期结果的方法?(我知道for 可能可以做到,但输出将不正确。)
列出基本名称中包含的所有文件zip(最后一个点之前,如果有的话)是很棘手的,原因有两个:
Windows 只有两个通配符:*和?。
*匹配任意数量的字符(包括零)。
?精确匹配一个字符(点除外),除非它是模式的最后一个字符,后跟一个点、仅其他通配符或仅其他通配符后跟一个点。1
长文件名中没有实际的扩展名。GUI 可能会将最后一个点后面的所有内容视为文件扩展名,但这只是一种约定。
更糟糕的是,.它在命令提示符上有特殊含义。在 LFN 之前,每个文件都有一个扩展名(尽管它可能为空)。因此,*.*匹配所有文件,而*仅匹配扩展名为空的文件。
为了保持一定的向后兼容性,.如果后面仅跟有通配符和其他点,则将被忽略,除非这些点相邻且后面至少有一个通配符,或者根本没有通配符且点之前最多有一个星号。1
例子:
foo?.bar将匹配 file foo.bar,但foo?bar不会匹配foobar或foo.bar。
*、*.*、*.*.、*.*.*和**.将匹配任何给定文件夹中的所有文件,而*.、*..和 则*..*不会。
除非您使用存档位来执行增量备份2,否则有一种方法可以仅使用 DIR 和ATTRIB命令来显示您感兴趣的文件(并且仅显示这些文件)。
脚步:
zip首先,对包含各自文件名中任意位置的所有文件设置存档位:
ATTRIB +A *zip*
Run Code Online (Sandbox Code Playgroud)
现在,取消设置所有具有扩展名的文件的存档位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 文件名不存在或已被更改。
由于上一个命令取消了诸如 之类的文件的存档位nanozip.zip,因此重置这些文件:
ATTRIB +A *zip*.*zip
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用/AADIR 命令的开关来仅显示具有设置归档位的文件:
DIR /AA *zip*
Run Code Online (Sandbox Code Playgroud)
通过/SDIR 开关和/S [/D]ATTRIB 开关,这甚至适用于子目录中的文件。
1这是一个怪癖列表,而不是对通配符行为的详尽解释。
2例如, Windows XP 的NTBackup尊重存档位。
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |