这是为什么?
在“ 通配符”文章中,可以找到“ 为什么 ”的答案:
The * wildcard will match any sequence of characters
(0 or more, including NULL characters)
The ? wildcard will match a single character
(or a NULL at the end of a filename)
…
通配符匹配规则
*
通常匹配任何0个或多个字符,但有一个例外(请参阅下一条规则)。非贪婪通配符可以自由匹配掩码其余部分匹配所需的任意数量的字符。
*.
掩码末尾与{dot}以外的0个或多个字符匹配。实际上,该规则适用于*和终端{dot}之间的任意数量的{dot}和{space}字符。这个词的正则表达式是"[*][. ]*[.]$"
?
匹配0或一个字符,{dot}除外。它唯一匹配0个字符的时间是匹配名称的末尾或{dot}之前的位置。问号也可以多次使用,以匹配多个字符。
含义。文件/文件夹名称中的最后一个 {dot} 分隔基本名称和扩展名。所以
dir *.
显示所有不带扩展名的项目,以及
dir *.*
显示所有扩展名为零或更多字符的项目。
严格来说,在name中dir *.
显示所有不带句号(.
)的项目。(BTW,命名文件,路径和命名空间 MSDN文章明确指出,“ 将句点指定为名称的首字符是可以接受的。”)
有什么办法只列出带点的文件?
我不这么认为。但是,有一个适合的正则表达式的解决方法。
PowerShell(如果在Powershell控制台中使用,则为全范围解决方案):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd(仅一个想法,可能需要详细说明):
:: CMD/batch - no extension
for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^.[^\.]*$"') do @echo %%~tG %%~aG %%~zG %%~nxG
:: CMD/batch - extension
for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^..*\...*$"') do @echo %%~tG %%~aG %%~zG %%~nxG
附录:奖金和解释
直觉的猜测Name
是串联的BaseName
,Extension
不成立。下面的脚本通过使用cmd
和PowerShell
核心功能对其进行了证明,而奇怪的 ^..*\...*$
regex是从其结果中得出的。
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "_workingDirectory=%~1"
if "%_workingDirectory%"=="%tmp%\tests_SU_1193102" (
>NUL 2>&1 (
mkdir "%_workingDirectory%"
pushd "%_workingDirectory%"
rem make directories
mkdir .Fldr-Ext
mkdir aFldr-Ext
mkdir .Fldr.Ext
mkdir aFldr.Ext
rem create files
copy NUL .File-Ext
copy NUL aFile-Ext
copy NUL .File.Ext
copy NUL aFile.Ext
popd
)
) else if "%_workingDirectory%"=="" set "_workingDirectory=%CD%"
pushd "%_workingDirectory%"
set "_first=ItemName Attributes BaseName Extension"
echo ON
:: dir /OGN | findstr "Ext$"
for /F "delims=" %%G in ('dir /OGN /B') do @((if defined _first (echo %_first%&echo(&set "_first="))&echo %%~nxG %%~aG %%~nG %%~xG)
:: Get-ChildItem | Select-Object -Property Mode, BaseName, Extension, Name
PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @{Expression='Mode';Descending=$true}, @{Expression='Name';Descending=$false}"
输出:
==> D:\bat\BaseName_vs_Extension.bat "%tmp%\tests_SU_1193102"
==> for /F "delims=" %G in ('dir /OGN /B') do @((if defined _first (echo ItemName Attributes BaseName Extension & echo( & set "_first=" ) ) & echo %~nxG %~aG %~nG %~xG )
ItemName Attributes BaseName Extension
.Fldr.Ext d---------- .Fldr .Ext
.Fldr-Ext d---------- .Fldr-Ext
aFldr.Ext d---------- aFldr .Ext
aFldr-Ext d---------- aFldr-Ext
.File.Ext --a-------- .File .Ext
.File-Ext --a-------- .File-Ext
aFile.Ext --a-------- aFile .Ext
aFile-Ext --a-------- aFile-Ext
==> PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @{Expression='Mode';Descending=$true}, @{Expression='Name';Descending=$false}"
Name Mode BaseName Extension
---- ---- -------- ---------
.Fldr.Ext d----- .Fldr.Ext .Ext
.Fldr-Ext d----- .Fldr-Ext .Fldr-Ext
aFldr.Ext d----- aFldr.Ext .Ext
aFldr-Ext d----- aFldr-Ext
.File.Ext -a---- .File .Ext
.File-Ext -a---- .File-Ext
aFile.Ext -a---- aFile .Ext
aFile-Ext -a---- aFile-Ext
比较BaseName
属性的定义,文件和文件夹的属性定义不同:
PS D:\PShell> Get-ChildItem | Get-Member -Name BaseName | Format-List -property TypeName, Definition
TypeName : System.IO.DirectoryInfo
Definition : System.Object BaseName {get=$this.Name;}
TypeName : System.IO.FileInfo
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt
0){$this.Name.Remove($this.Name.Length -
$this.Extension.Length)}else{$this.Name};}
我最初的答案是基于不可原谅的误解:
阅读dir /?
,使用dir /A:-D
:
/A Displays files with specified attributes.
attributes D Directories R Read-only files
H Hidden files A Files ready for archiving
S System files I Not content indexed files
L Reparse Points - Prefix meaning not
另一种方法:将findstr
正则表达式应用为dir *.* | findstr /V "<.*>"