Mengapa demikian?
Orang dapat menemukan jawaban untuk " Mengapa begitu? " Dalam artikel Wildcard :
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)
...
Aturan pencocokan wildcard
*
Umumnya cocok dengan 0 karakter atau lebih, dengan satu pengecualian (lihat aturan berikutnya). Kartu liar non-serakah bebas untuk mencocokkan sebanyak atau sesedikit karakter yang diperlukan untuk sisa topeng untuk mencocokkan.
*.
Di akhir mask cocok dengan 0 karakter atau lebih kecuali untuk {dot}. Dalam kenyataannya, aturan berlaku dengan sejumlah {dot} dan {spasi} karakter antara * dan terminal {dot}. Ekspresi reguler untuk istilah ini adalah"[*][. ]*[.]$"
?
Cocokkan 0 atau satu karakter, kecuali untuk {dot}. Satu-satunya waktu yang cocok dengan 0 karakter adalah ketika cocok dengan akhir nama, atau posisi sebelum {dot}. Tanda tanya juga dapat digunakan lebih dari satu kali untuk mencocokkan lebih dari satu karakter.
Implikasi . The terakhir {dot} dalam file / nama folder memisahkan nama dasar dan ekstensi. Begitu
dir *.
menampilkan semua item tanpa ekstensi , dan
dir *.*
menampilkan semua item dengan ekstensi nol atau lebih karakter .
Sebenarnya, dir *.
menampilkan semua item tanpa titik ( .
) dalam nama . (BTW, File Penamaan, Paths, dan Namespaces artikel MSDN mengatakan secara eksplisit bahwa " dapat diterima untuk menentukan periode sebagai karakter pertama dari nama ".)
Apakah ada cara untuk mendaftar hanya file dengan titik?
Saya kira tidak. Namun, ada solusi dengan ekspresi reguler yang pas.
PowerShell (solusi lingkup penuh jika digunakan dalam konsol Powershell):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd (hanya ide, mungkin memerlukan elaborasi):
:: 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
Tambahan: bonus dan penjelasan
Tebakan intuitif yang Name
digabungkan BaseName
dan Extension
tidak berlaku . Script berikut membuktikannya menggunakan cmd
dan PowerShell
fitur inti, dan regex aneh ^..*\...*$
berasal dari hasil itu.
@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}"
Keluaran :
==> 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
Bandingkan definisi BaseName
properti, berbeda untuk file dan folder:
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};}
Jawaban asli saya didasarkan pada kesalahpahaman yang tak termaafkan:
Baca dir /?
, gunakan 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
Pendekatan lain: terapkan findstr
regex sebagaidir *.* | findstr /V "<.*>"