Tại sao vậy?
Người ta có thể tìm thấy câu trả lời cho " Tại sao lại như vậy? " Trong bài viết về 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)
Giáo dục
Quy tắc khớp ký tự đại diện
*
Thường khớp với bất kỳ 0 ký tự trở lên, với một ngoại lệ (xem quy tắc tiếp theo). Ký tự đại diện không tham lam có thể tự do kết hợp nhiều hoặc ít ký tự cần thiết cho phần còn lại của mặt nạ để khớp.
*.
Ở cuối mặt nạ phù hợp với bất kỳ 0 hoặc nhiều ký tự ngoại trừ {dot}. Trong thực tế, quy tắc áp dụng với bất kỳ số lượng ký tự {dot} và {space} nào giữa * và terminal {dot}. Biểu thức chính quy cho thuật ngữ này là"[*][. ]*[.]$"
?
Khớp 0 hoặc một ký tự, ngoại trừ {dot}. Lần duy nhất nó khớp với 0 ký tự là khi nó khớp với phần cuối của tên hoặc vị trí trước {dot}. Dấu hỏi cũng có thể được sử dụng nhiều lần để khớp với nhiều hơn một ký tự.
Hàm ý . Các cuối cùng {dot} trong một tập tin / thư mục tên tách tên cơ sở và mở rộng. Vì thế
dir *.
hiển thị tất cả các mục không có phần mở rộng và
dir *.*
hiển thị tất cả các mục có phần mở rộng bằng 0 hoặc nhiều ký tự .
Nói đúng ra, dir *.
hiển thị tất cả các mục không có dấu chấm ( .
) . (BTW, Đặt tên tệp, đường dẫn và không gian tên Bài viết MSDN nói rõ ràng rằng " có thể chấp nhận một khoảng thời gian là ký tự đầu tiên của tên ".)
Có cách nào để liệt kê chỉ các tệp có dấu chấm không?
Tôi không nghĩ vậy. Tuy nhiên, có một cách giải quyết với biểu thức chính quy phù hợp.
PowerShell (giải pháp phạm vi đầy đủ nếu được sử dụng trong bảng điều khiển Powershell):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
Cmd (chỉ một ý tưởng, có thể yêu cầu một số chi tiết):
:: 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
Phụ lục: phần thưởng và giải thích
Một phỏng đoán trực quan Name
được nối BaseName
và Extension
không giữ . Kịch bản sau đây chứng minh nó sử dụng cmd
và PowerShell
các tính năng cốt lõi, và biểu thức chính kỳ lạ ^..*\...*$
bắt nguồn từ kết quả của nó.
@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}"
Đầu ra :
==> 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
So sánh định nghĩa của thuộc BaseName
tính, khác nhau cho các tệp và thư mục:
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};}
Câu trả lời ban đầu của tôi dựa trên sự hiểu lầm không thể tha thứ:
Đọc dir /?
, sử dụng 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
Một cách tiếp cận khác: áp dụng findstr
regex nhưdir *.* | findstr /V "<.*>"