Pourquoi donc?
On pourrait trouver une réponse à " Pourquoi est-ce? " Dans l' article 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)
…
Règles de correspondance générique
*
Correspond généralement à 0 caractère ou plus, à une exception près (voir la règle suivante). Le caractère générique non gourmand est libre de faire correspondre le nombre de caractères nécessaire pour que le reste du masque corresponde.
*.
À la fin du masque, correspond à tout caractère égal ou supérieur à 0, à l'exception de {point}. En réalité, la règle s'applique avec un nombre quelconque de caractères {point} et {espace} entre le * et le terminal {point}. L’expression régulière de ce terme est"[*][. ]*[.]$"
?
Match 0 ou un caractère, sauf pour {dot}. La seule fois où il correspond à 0 caractère, c'est quand il correspond à la fin du nom ou à la position avant un {point}. Le point d'interrogation peut également être utilisé plusieurs fois pour faire correspondre plusieurs caractères.
Implication . Le dernier {point} d'un nom de fichier / dossier sépare le nom de base et l'extension. Alors
dir *.
affiche tous les articles sans extension , et
dir *.*
affiche tous les éléments avec une extension de zéro ou plusieurs caractères .
À proprement parler, dir *.
affiche tous les éléments sans.
nom ( ) . (Article BTW, noms de fichiers, chemins d'accès et espaces de noms, article MSDN stipulant explicitement qu '" il est acceptable de spécifier un point comme premier caractère d'un nom ".)
Est-il possible de ne lister que les fichiers avec un point?
Je ne pense pas. Toutefois, il existe une solution de contournement avec une expression régulière appropriée.
PowerShell (solution complète si utilisée dans une 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 (une idée seulement, peut nécessiter quelques précisions):
:: 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
Addendum: un bonus et une explication
Une hypothèse intuitive qui Name
est concaténée BaseName
et Extension
ne tient pas . Le script suivant prouve à l'aide cmd
et PowerShell
fonctionnalités de base, et l' étrange ^..*\...*$
regex est dérivé de résultats est tout.
@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}"
Sortie :
==> 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
Comparez la définition de la BaseName
propriété, différente pour les fichiers et les dossiers:
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};}
Ma réponse initiale était basée sur un malentendu impardonnable:
Lire dir /?
, utiliser 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
Une autre approche: appliquer findstr
regex en tant quedir *.* | findstr /V "<.*>"