ऐसा क्यों है?
वाइल्डकार्ड्स लेख में " ऐसा क्यों है? " का उत्तर मिल सकता है :
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 या अधिक वर्णों से मेल खाता है, एक अपवाद के साथ (अगला नियम देखें)। गैर-लालची वाइल्डकार्ड मिलान के शेष के लिए आवश्यक के रूप में कई या कुछ वर्णों से मेल खाने के लिए स्वतंत्र है।
*.
मुखौटा के अंत में {डॉट} को छोड़कर किसी भी 0 या अधिक वर्णों से मेल खाता है। वास्तविकता में, नियम * और टर्मिनल {डॉट} के बीच किसी भी संख्या पर {डॉट} और {स्पेस} अक्षर के साथ लागू होता है। इस शब्द की नियमित अभिव्यक्ति है"[*][. ]*[.]$"
?
{0} को छोड़कर, 0 या एक वर्ण का मिलान करें। केवल समय 0 वर्णों से मेल खाता है, जब यह नाम के अंत या एक {dot} से पहले की स्थिति से मेल खाता है। प्रश्न चिह्न का उपयोग एक से अधिक वर्णों के मिलान के लिए एक से अधिक बार भी किया जा सकता है।
आरोपण । पिछले {डॉट} एक फ़ाइल / फ़ोल्डर नाम पर अलग करती आधार नाम और एक्सटेंशन। इसलिए
dir *.
बिना एक्सटेंशन वाले सभी आइटम प्रदर्शित करता है , और
dir *.*
शून्य या अधिक वर्णों के विस्तार के साथ सभी आइटम प्रदर्शित करता है ।
सख्ती से बोलना, नाम के बिना अवधि ( ) के साथ सभी आइटमdir *.
प्रदर्शित करता है । (BTW, नामकरण फ़ाइलें, पथ, और नामस्थान MSDN लेख स्पष्ट रूप से कहते हैं कि " किसी नाम के पहले वर्ण के रूप में एक अवधि निर्दिष्ट करना स्वीकार्य है "।).
क्या डॉट के साथ केवल फाइलों को सूचीबद्ध करने का कोई तरीका है?
मुझे ऐसा नहीं लगता। हालाँकि, फिटिंग रेगुलर एक्सप्रेशन के साथ वर्कअराउंड है।
पावरशेल (पूर्ण शक्ति समाधान यदि पॉवरशेल कंसोल में उपयोग किया जाता है):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
सेमी (केवल एक विचार, कुछ विस्तार की आवश्यकता हो सकती है):
:: 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
मुख्य विशेषताओं को साबित करता है, और अजीब ^..*\...*$
रेगेक्स इसके परिणामों से प्राप्त होता है।
@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
रेगेक्स को लागू करेंdir *.* | findstr /V "<.*>"