Por que é que?
Pode-se encontrar uma resposta para " Por que isso? " No artigo Wildcards :
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)
…
Regras de correspondência curinga
*
Geralmente corresponde a 0 ou mais caracteres, com uma exceção (consulte a próxima regra). O curinga não-guloso é livre para corresponder a tantos ou quantos caracteres forem necessários para que o restante da máscara corresponda.
*.
No final da máscara, corresponde a 0 ou mais caracteres, exceto {dot}. Na verdade, a regra se aplica a qualquer número de {dot} e {space} caracteres entre o * e o terminal {dot}. A expressão regular para este termo é"[*][. ]*[.]$"
?
Corresponde 0 ou um caractere, exceto {dot}. A única vez que corresponde a 0 caracteres é quando corresponde ao final do nome ou à posição antes de {dot}. O ponto de interrogação também pode ser usado mais de uma vez para corresponder a mais de um caractere.
Implicação . O último {dot} em um nome de arquivo / pasta separa o nome base e a extensão. assim
dir *.
exibe todos os itens sem extensão e
dir *.*
exibe todos os itens com extensão de zero ou mais caracteres .
Estritamente falando, dir *.
exibe todos os itens sem período ( .
) no nome . (BTW, Naming Files, Paths e Namespaces MSDN artigo 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?
Acho que não. No entanto, há uma solução alternativa com uma expressão regular apropriada.
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 explicação
Um palpite intuitivo que Name
é concatenado BaseName
e Extension
não é válido . O script a seguir prova sua utilização cmd
e os PowerShell
principais recursos, e o regex estranho ^..*\...*$
é 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
Compare a definição de BaseName
propriedade, 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: aplicar findstr
regex comodir *.* | findstr /V "<.*>"