Warum ist das so?
Man könnte eine Antwort auf " Warum ist das so? " Im Wildcards- Artikel finden:
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)
…
Regeln für den Wildcard-Abgleich
*
Stimmt im Allgemeinen mit 0 oder mehr Zeichen überein, mit einer Ausnahme (siehe nächste Regel). Es steht dem nicht-gierigen Platzhalter frei, so viele oder so wenige Zeichen zuzuordnen, wie für den Rest der Maske erforderlich sind.
*.
Am Ende der Maske werden 0 oder mehr Zeichen mit Ausnahme von {dot} gefunden. Tatsächlich gilt die Regel für eine beliebige Anzahl von {Punkt} und {Leerzeichen} zwischen dem * und dem Terminal {Punkt}. Der reguläre Ausdruck für diesen Begriff lautet"[*][. ]*[.]$"
?
Stimmt mit 0 oder einem Zeichen überein, außer mit {dot}. Die einzige Übereinstimmung mit 0 Zeichen besteht darin, dass das Ende des Namens oder die Position vor einem {Punkt} angegeben wird. Das Fragezeichen kann auch mehrmals verwendet werden, um mehr als ein Zeichen zu finden.
Implikation . Der letzte {Punkt} in einem Datei- / Ordnernamen trennt den Basisnamen und die Erweiterung. Damit
dir *.
zeigt alle Einzelteile mit keiner Erweiterung und
dir *.*
Zeigt alle Elemente mit einer Erweiterung von null oder mehr Zeichen an .
Streng genommen dir *.
werden alle Elemente ohne Punkt ( .
) im Namen angezeigt . (Übrigens, Benennen von Dateien, Pfaden und Namespaces MSDN-Artikel besagt ausdrücklich, dass " es akzeptabel ist, einen Punkt als erstes Zeichen eines Namens anzugeben ".)
Gibt es eine Möglichkeit, nur Dateien mit einem Punkt aufzulisten?
Ich glaube nicht Es gibt jedoch eine Problemumgehung mit einem passenden regulären Ausdruck.
PowerShell (Komplettlösung bei Verwendung in einer Powershell-Konsole):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd (nur eine Idee, könnte etwas Ausarbeitung erfordern):
:: 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
Nachtrag: Bonus und Erklärung
Eine intuitive Vermutung, Name
die verkettet ist BaseName
und Extension
nicht gilt . Das folgende Skript beweist die Verwendung cmd
und die PowerShell
Kernfunktionen, und der seltsame ^..*\...*$
reguläre Ausdruck wird aus den Ergebnissen abgeleitet.
@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}"
Ausgabe :
==> 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
Vergleichen Sie die Definition der BaseName
Eigenschaft, die für Dateien und Ordner unterschiedlich ist:
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};}
Meine ursprüngliche Antwort basierte auf einem unverzeihlichen Missverständnis:
Lesen Sie dir /?
, verwenden Sie 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
Ein anderer Ansatz: findstr
Regex anwenden alsdir *.* | findstr /V "<.*>"