我只是想检查转储目录中是否有任何 ZIP 程序,例如 PeaZip、NanoZip 等,但却遇到了一个我以前只见过几次的奇怪问题。
我使用以下命令列出以下文件:文件名包含zip
(例如,,,nanozip.zip
等):peazip2.rar
winzip-beta.exe
dir *zip*
这列出了文件名包含 的所有文件zip
,而且所有带有.zip
扩展名的文件(例如,foobar.zip
)。
然后我尝试了以下操作:
dir *zip*.*
这给出了相同的结果。
有人知道怎样得到预期的结果吗?(我知道for
可能能够做到这一点,但输出不正确。
答案1
问题
列出zip
基本名称中包含的所有文件(如果有的话,在最后一个点之前)很棘手,原因有二:
Windows 只有两个通配符:
*
和?
。*
匹配任意数量的字符(包括零个)。?
匹配一个字符(点除外),除非它是模式的最后一个字符,后跟一个点,仅匹配其他通配符,或者仅匹配其他通配符然后匹配一个点。1长文件名没有实际的扩展名。GUI 可能会将最后一个点后面的所有内容视为文件扩展名,但这只是惯例。
更糟糕的是,
.
在命令提示符上具有特殊含义。在 LFN 之前,每个文件都有一个扩展名(尽管它可以为空)。因此,*.*
匹配所有文件,而*
仅匹配扩展名为空的文件。为了保持一定的向后兼容性,
.
如果它后面只有通配符和其他点,则会被忽略,除非这些点相邻且后面至少有一个通配符,或者根本没有通配符并且点前最多有一个星号。1
例子:
foo?.bar
将匹配文件foo.bar
,但foo?bar
不会匹配也不foobar
匹配foo.bar
。*
、、、和将匹配任何给定文件夹中的所有文件,而*.*
、和则不会。*.*.
*.*.*
**.
*.
*..
*..*
解决方法
除非你使用存档位要执行增量备份2,有一种方法可以显示你感兴趣的文件(并且只显示那些),只使用 DIR 和属性命令。
脚步:
zip
首先,在所有文件名中包含以下内容的文件上设置存档位:ATTRIB +A *zip*
现在,取消设置所有具有以下扩展名的文件的存档位
zip
:ATTRIB -A *.zip
如果您想要排除其扩展名
zip
也以 结尾的文件(例如ezip
),请使用以下命令:ATTRIB -A *.*zip
由于
*.*zip
也将针对 8.3 文件名进行测试,因此这也会匹配相应扩展名以 开头的文件zip
(例如zipx
),除非 8.3 文件名不存在或已被更改。由于上一个命令取消了对文件的存档位设置
nanozip.zip
,因此请重置这些文件:ATTRIB +A *zip*.*zip
现在,您可以使用
/AA
DIR 命令的开关仅显示设置了存档位的文件:DIR /AA *zip*
通过/S
打开 DIR 开关和/S [/D]
打开 ATTRIB 开关,这甚至适用于子目录中的文件。
1这只是一个怪癖列表,而不是对通配符行为的详尽解释。
2 Windows XP备份软件例如,尊重档案位。
答案2
不是一个好人,但可以工作。
dir | findstr ini..*
dots
用作正则表达式,表示任意字符,*
从 0 到无限次
唯一的缺点是它不能匹配没有扩展名的文件。
答案3
如果你愿意“目测”,那么使用
目录 /OE *zip*
这将按扩展名对输出进行排序,并可以从视觉上忽略那些带有 .zip 扩展名的文件 - 它们将全部组合在一起。
对于您可以检查、修改等的列表,将输出发送到文件:
dir /OE *zip* > myzip.txt
答案4
与上面一周的解决方案类似:
dir | findstr /e zip.*.[a-z]*
这应该查找包含“zip”、后跟任意数量的字符、后跟“.”和任意数量的字母、后跟文件名结尾的任何内容。我还遗漏了什么吗?