¿Porqué es eso?
Uno podría encontrar una respuesta a " ¿Por qué es eso? " En el artículo sobre comodines :
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)
...
Reglas de coincidencia de comodines
*
Generalmente coincide con 0 o más caracteres, con una excepción (ver la siguiente regla). El comodín no codicioso puede combinar tantos o tan pocos caracteres como sea necesario para que coincida el resto de la máscara.
*.
Al final de la máscara coincide con 0 o más caracteres, excepto {dot}. En realidad, la regla se aplica con cualquier número de caracteres {dot} y {space} entre el * y el terminal {dot}. La expresión regular para este término es"[*][. ]*[.]$"
?
Haga coincidir 0 o un carácter, excepto {dot}. La única vez que coincide con 0 caracteres es cuando coincide con el final del nombre o la posición antes de un {punto}. El signo de interrogación también se puede usar más de una vez para unir más de un carácter.
Implicación . El último {punto} en un nombre de archivo / carpeta separa el nombre base y la extensión. Entonces
dir *.
muestra todos los elementos sin extensión y
dir *.*
Muestra todos los elementos con una extensión de cero o más caracteres .
Estrictamente hablando, dir *.
muestra todos los elementos sin punto ( .
) en el nombre . (BTW, Naming Files, Paths, and Namespaces El artículo de MSDN dice explícitamente que " es aceptable especificar un punto como primer carácter de un nombre ").
¿Hay alguna manera de enumerar solo archivos con un punto?
No lo creo. Sin embargo, hay una solución alternativa con una expresión regular adecuada.
PowerShell (solución de alcance completo si se usa en una consola Powershell):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd (solo una idea, puede requerir alguna elaboración):
:: 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
Anexo: una bonificación y explicación
Una suposición intuitiva que Name
se concatena BaseName
y Extension
no se sostiene . La siguiente secuencia de comandos lo prueba con las características principales cmd
y el uso PowerShell
, y la extraña ^..*\...*$
expresión regular se deriva de sus 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}"
Salida :
==> 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 la definición de BaseName
propiedad, diferente para archivos y carpetas:
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};}
Mi respuesta original se basó en un malentendido imperdonable:
Leer dir /?
, usar 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
Otro enfoque: aplicar findstr
regex comodir *.* | findstr /V "<.*>"