ทำไมถึงเป็นอย่างนั้น?
เราสามารถหาคำตอบของ " ทำไมจึงเป็นเช่นนั้น " ในบทความ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)
...
กฎการจับคู่สัญลักษณ์การค้นหา
*
โดยทั่วไปจะตรงกับอักขระ 0 ตัวขึ้นไปโดยมีข้อยกเว้นหนึ่งข้อ (ดูกฎต่อไป) wildcard ที่ไม่ใช่โลภมีอิสระในการจับคู่อักขระให้มากหรือน้อยตามที่จำเป็นเพื่อให้ส่วนที่เหลือของหน้ากากจับคู่
*.
ในตอนท้ายของหน้ากากตรงกับอักขระ 0 ตัวขึ้นไปยกเว้น {dot} ในความเป็นจริงกฎจะใช้กับอักขระ {dot} และ {space} จำนวนเท่าใดก็ได้ระหว่าง * และเทอร์มินัล {dot} การแสดงออกปกติสำหรับคำนี้คือ"[*][. ]*[.]$"
?
จับคู่ 0 หรือหนึ่งตัวละครยกเว้นสำหรับ {dot} เวลาเดียวที่ตรงกับ 0 ตัวอักษรคือเมื่อตรงกับส่วนท้ายของชื่อหรือตำแหน่งก่อน {dot} เครื่องหมายคำถามสามารถใช้มากกว่าหนึ่งครั้งเพื่อจับคู่มากกว่าหนึ่งอักขระ
ความหมาย สุดท้าย {} จุดในไฟล์ชื่อโฟลเดอร์ / แยกชื่อและการขยายฐาน ดังนั้น
dir *.
แสดงรายการทั้งหมดที่ไม่มีส่วนขยายและ
dir *.*
แสดงรายการทั้งหมดที่มีการขยายตัวของศูนย์หรือมากกว่าตัวอักษร
พูดอย่างเคร่งครัดdir *.
แสดงรายการทั้งหมดที่มีระยะเวลาไม่มี ( .
) ในชื่อ (BTW, ไฟล์การตั้งชื่อ, เส้นทางและ Namespacesบทความ MSDN กล่าวอย่างชัดเจนว่า " เป็นที่ยอมรับได้ในการระบุจุดเป็นอักขระตัวแรกของชื่อ ")
มีวิธีใดบ้างที่จะแสดงเฉพาะไฟล์ที่มีจุด?
ฉันไม่คิดอย่างนั้น อย่างไรก็ตามมีวิธีแก้ไขปัญหาด้วยการแสดงผลปกติที่เหมาะสม
PowerShell (โซลูชันขอบเขตทั้งหมดหากใช้ในคอนโซล Powershell):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd (ความคิดเท่านั้นอาจต้องมีรายละเอียดเพิ่มเติม):
:: 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
ภาคผนวก: โบนัสและคำอธิบาย
เดาการใช้งานที่ง่ายName
คือการตัดแบ่งBaseName
และไม่ได้ถือExtension
สคริปต์ต่อไปนี้พิสูจน์การใช้งานcmd
และPowerShell
คุณสมบัติหลักและregex แปลก ๆ ^..*\...*$
ได้มาจากผลลัพธ์ของมัน
@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}"
ผลผลิต :
==> 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
เปรียบเทียบคำจำกัดความของBaseName
ทรัพย์สินแตกต่างกันสำหรับไฟล์และโฟลเดอร์:
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};}
คำตอบเดิมของฉันขึ้นอยู่กับความเข้าใจผิดที่ยกโทษให้ไม่ได้:
อ่านdir /?
ใช้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
วิธีการอื่น: ใช้findstr
regexเป็นdir *.* | findstr /V "<.*>"