Answers:
自Windows 95和NT 3.5引入“长文件名”支持以来,文件名和扩展名一直是一个字段,并且一次对整个文件名进行通配符匹配。结果,您可以使用不带点的文件名(对于文件来说可能很少,但对于文件夹/目录来说很常见),乍一看*.*
实际上并不匹配这些文件。
使用旧的脚本*.*
将仍然是因为兼容性代码工作-如果通配符结尾.*
,这部分是由操作系统忽略。(因此,如果您想使用扩展名专门匹配文件,我想您将需要这样做*.?*
。)
但这不是您应该依赖的东西。如果要为现代Windows版本编写脚本,请遵循它们的约定,而不要遵循MS-DOS约定。(请注意,从Windows NT开始,.bat脚本不再由MS-DOS解释,而是由cmd.exe
本机Win32程序解释。)
在Linux和其他各种Unixen上,名称和扩展名从来没有分开过,并且没有任何特殊的方法可以*.*
工作,所以*
唯一有意义的选择是。
*
只能匹配文件名而没有扩展名。两者兼容的“安全”方法是使用**
。
这也许值得一提的是,unixy / posixy炮弹一样的Bourne shell时,bash和ksh,zsh的,等做通配符扩展(全域字符,例如*
,?
,[range]
,[!range]
和其他扩展像括号和扩展水珠)编译的参数列表前的命令被执行。因此,此扩展是由Shell而不是由其作为参数的命令完成的。
即Shell负责什么*
,*.*
扩展到
$ ls
file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension
$ (set -xv; foo *) # is actually expanded to the following
+ foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension
$ (set -xv; foo *.*) # note this does not match `zz-file-without-extension`
+ foo file.csv file.doc file.pdf file.txt file.xlsx
在CMD中(与Powershell实用程序类似),情况并非如此,因为它会将glob字符逐字传递到执行的命令中-因此扩展是命令/实用程序而不是Shell的责任。因此,最终,该工具留给工具*.*
或*
工具以使其符合(或不符合)约定,这就是为什么CMD的工具dir *.*
也匹配(可能错误地保留期望)文件而没有扩展名的原因。
我相信以这种方式进行总结是安全的。
FindFirstFile
本身是用户模式(kernel32.dll和ntdll.dll都是用户模式库-它是Win32子系统的一部分,而不是内核的一部分),但实际上并没有做什么。
mmv "fred.*" "tom.#1"
。(替换使用#1
代替*
,这具有让您对字段重新排序的优势)。 mmv
默认情况下,大多数系统上未安装该工具,但通常会安装其他批处理重命名工具。请参阅有关此文章,以及stackoverflow.com/questions/417916/how-to-do-a-mass-rename。
*
并且*.*
现在对于cmd
内部命令和现代命令行实用程序来说是等效的,但是某些采用文件掩码参数的较旧的实用程序可能会使用较旧的文件匹配功能,并且对于它们而言,掩码将不等效。