Por que isso acontece?
Pode-se encontrar uma resposta para " Por que isso? " em Wildcards < Artigo / strong> :
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)
…
Wildcard matching rules
*
Generally matches any 0 or more characters, with one exception (see next rule). The non-greedy wildcard is free to match as many or
as few characters as are necessary for the remainder of the mask to
match.
*.
At end of mask matches any 0 or more characters except for {dot}. In actuality, the rule applies with any number of {dot} and
{space} characters between the * and terminal {dot}. The regular
expression for this term is "[*][. ]*[.]$"
?
Match 0 or one character, except for {dot}. The only time it matches 0 characters is when it matches the end of the name, or the
position before a {dot}. The question mark can also be used more than
once to match more than one character.
Implicação . O último {dot} em um nome de arquivo / pasta separa nome e extensão base. Então
-
dir *.
exibe todos os itens com sem extensão e
-
dir *.*
exibe todos os itens com extensão de zero ou mais caracteres .
Estritamente falando, dir *.
exibe todos os itens com sem período ( .
) no nome . (BTW, Nomeando arquivos, caminhos e namespaces Artigo MSDN diz explicitamente que " é aceitável especificar um período como o primeiro caractere de um nome ".
Existe alguma maneira de listar apenas arquivos com um ponto?
Eu não penso assim. No entanto, há uma solução alternativa com uma expressão regular adequada.
PowerShell (solução de escopo total, se usada em um console Powershell):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd (apenas uma ideia, pode exigir alguma elaboração):
:: 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
Adendo: um bônus e uma explicação
Um palpite intuitivo de que Name
está concatenado BaseName
e Extension
não é válido . O script a seguir prova isso usando os recursos cmd
e PowerShell
core, e o estranho ^..*\...*$
regex é derivado de seus resultados.
@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}"
Saída :
==> 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
Comparar a definição da propriedade BaseName
, diferente para arquivos e pastas:
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};}
Minha resposta original foi baseada em mal-entendidos imperdoáveis:
Leia dir /?
, use 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
Outra abordagem: aplique findstr
regex como dir *.* | findstr /V "<.*>"