क्यों `dir *। *` मुझे सभी फ़ाइलें और फ़ोल्डर्स देते हैं?


62

जब मैं चलाता हूं तो dir *.*यह अप्रत्याशित परिणाम देता है। यहां तक ​​कि उनके नाम के बिना कोई भी फाइल और फोल्डर सूचीबद्ध नहीं हैं। उदाहरण के लिए

C:\>dir *.*
 Volume in drive C is System
 Volume Serial Number is AC0A-29DA

 Directory of C:\

14-03-2017  05:17 PM             8,192 ntuser.dat
03-01-2017  07:10 PM    <DIR>          Perl520
28-03-2017  10:13 AM    <DIR>          Program Files
28-03-2017  10:13 AM    <DIR>          Program Files (x86)
04-01-2017  03:25 PM    <JUNCTION>     Python27 [C:\Program Files\Anaconda]
06-02-2017  10:16 PM    <DIR>          SAP
28-03-2017  04:10 PM               152 useragent.log
03-01-2017  03:04 PM    <DIR>          Users
16-03-2017  04:24 PM    <DIR>          VM
22-03-2017  11:13 AM    <DIR>          Windows
               2 File(s)          8,344 bytes
               8 Dir(s)  270,172,966,912 bytes free

ऐसा क्यों है? क्या डॉट के साथ केवल फाइलों को सूचीबद्ध करने का कोई तरीका है?


19
बिंदी हमेशा से ही है, यह तब तक नहीं छपी है जब तक कि इसके पीछे कुछ न हो। दूसरे शब्दों में, आप सोच सकते हैं कि एक फ़ाइल का नाम "यह मेरी फ़ाइल है" लेकिन गुप्त रूप से नाम "यह मेरी फ़ाइल है।" डॉट के बाद कुछ भी नहीं है। एनालॉग रूप से, आप सोच सकते हैं कि इस साइट का DNS नाम "superuser.com" है, लेकिन यह वास्तव में "superuser.com" है। दूसरी बिंदी के बाद कुछ भी नहीं।
टोड विलकॉक्स

12
@ToddWilcox यह केवल डॉस में सही है। विंडोज में आधुनिक फाइलसिस्टम का अब अलग से कोई नामस्थान नहीं है
फुलकव

13
@ LưuV LnhPhúc Win32 सबसिस्टम फाइलनेम का इलाज करता है जिसमें ऐसा नहीं होता है .जैसे उनके पास .कई उद्देश्यों के लिए अंत है, जिसमें यह भी शामिल है।
कोडइन्चौस

2
जिन फ़ोल्डरों में .वर्ण नहीं होता है, उनमें .अंत में एक निहित चरित्र होता है। - आपके पास उदाहरण के लिए "Blah.old" नामक एक फ़ोल्डर हो सकता है, और फिर इसमें एक पारंपरिक 3 अक्षर फ़ाइल एक्सटेंशन होगा; दिन-प्रतिदिन के उपयोग के लिए हालांकि " Blah" एक ही है " Blah." चाहे वह फ़ाइल या फ़ोल्डर हो।
ब्रेनस्ल्गस83

9
DNS के बारे में @ can-ned_food टॉड विलकॉक्स सही है। मूल DNS ज़ोन को शाब्दिक रूप से संदर्भित किया जाता है ., और DNS नामों में लेबल को अलग किया जाता है .(इस प्रकार रूट DNS ज़ोन का नाम एक एकल-शून्य लेबल है)। मूल DNS ज़ोन .का com.एक बच्चा है , और एक बच्चा com.है superuser.com., और इसी तरह।
एक CVn

जवाबों:


115

मैं यह जवाब लिख रहा हूं क्योंकि ओपी ने जोर दिया है कि:

मुझे क्या दिलचस्पी है क्यों *.*सभी फाइलों से मेल खाता है, जैसा कि प्रश्न में कहा गया है

DIRआदेश ऐसे समय में जब से आता है:

  1. अवधि (?) को फ़ाइल या फ़ोल्डर नामों में एक चरित्र के रूप में अनुमति नहीं दी गई थी
  2. फ़ाइल और फ़ोल्डर नाम नाम के लिए 8 वर्ण और एक्सटेंशन के लिए 3 वर्ण तक सीमित थे

इसलिए, उस मानक से, *.*जिसका अर्थ नाम और जो कुछ भी विस्तार है । इसका मतलब यह नहीं था कि "" से युक्त एक स्ट्रिंग है, जिसमें "या" से पहले या बाद के अक्षर नहीं हो सकते हैं।

Microsoft नीति पिछड़े संगतता को संरक्षित कर रही है। इसलिए, उस व्याख्या *.*को बरकरार रखा गया है।

लेकिन विंडोज पॉवरशेल में, एक स्ट्रिंग का*.* अर्थ है "।", जिसमें "से पहले या बाद में वर्ण हो सकते हैं या नहीं हो सकते हैं।"


10

25
मूल फ़ाइल सिस्टम ने डिस्क पर ही अवधि को स्टोर नहीं किया, केवल 11 अक्षर शेष नाम बनाते हैं।
श्री लिस्टर

7
यह ध्यान देने योग्य है कि एक्सटेंशन के बिना फ़ाइलों और फ़ोल्डरों को अभी भी एक खाली एक्सटेंशन के रूप में माना जाता है । इसलिए, " Folder." नाम का एक फ़ोल्डर , और " Folder" नामक एक फ़ोल्डर को उसी चीज़ का नाम दिया गया है, जहां तक ​​विंडोज़ का संबंध है।
ब्रेनस्ल्गस83

2
@MrLister दिलचस्प। AA.BBपहले भाग में <8 और <3 के साथ पुराने FS स्टोर नाम कैसे दर्ज किए गए थे? यह सिर्फ रिक्त स्थान के साथ पैड?
केल्विन

3
@ केल्विन हाँ दो भागों अलग अलग जगह गद्देदार थे।
प्लग

12

ऐसा क्यों है?

वाइल्डकार्ड्स लेख में " ऐसा क्यों है? " का उत्तर मिल सकता है :

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 "<.*>"


मेरी दिलचस्पी यह है कि क्यों *.*सभी फाइलों से मेल खाता है , जैसा कि प्रश्न में कहा गया है
phuclv

मुझे डर है कि आपका वैकल्पिक सुझाव (खोज) एक .तरह से शुरू होने वाले फ़ोल्डर नहीं मिल रहा है .dbus-keyrings, .VirtualBoxऔर .vscode

22
तो dir /A:-Dकेवल उन फाइलों को सूचीबद्ध करता है जो खुश हैं?
क्वेंटिन

4
"क्या केवल डॉट वाली फाइलों को सूचीबद्ध करने का कोई तरीका है?" dir /A:-Dगलत है। 1 / यह बिना एक्सटेंशन वाली फाइलों को सूचीबद्ध करता है। 2 / यह उन निर्देशिकाओं को सूचीबद्ध नहीं करता .है जिनके नाम में (पूरी तरह से कानूनी)
डेविडपोस्टिल

3
omg ... यह दशकों से है जब मैंने आखिरी बार "
@ टेको

7

क्या डॉट के साथ केवल फाइलों को सूचीबद्ध करने का कोई तरीका है?

आप undocumented वाइल्डकार्ड का उपयोग करके एक डॉट के साथ फ़ाइल नाम का मिलान कर सकते हैं <, जो या तो बेसन में 0 या अधिक वर्णों के अनुक्रम या एक्सटेंशन में 0 या अधिक वर्णों के अनुक्रम से मेल खाता है:

dir "<.<"

याद रखें कि <यह एक मेटाचैकर भी है, इसलिए जब भी आप इसे कमांड शेल से पैटर्न में उपयोग करते हैं तो इसे उद्धृत या बचाना होगा।


1
अति उत्कृष्ट। यह
अनिर्दिष्ट

1

कमांड लाइन दुभाषिया देखेंगे " के साथ" सभी एक्सटेंशन "" सभी आधार फ़ाइल नाम "के रूप में"। एक रिक्त एक्सटेंशन अभी भी एक विस्तार है , इसलिए मिलान किया जाएगा और सूची के साथ वापस आ जाएगा। जैसा कि दूसरों ने समझाया है, यह विंडोज और एमएस-डॉस के पुराने संस्करणों से हैंगओवर है।

यदि आप PowerShell का उपयोग करके खुश हैं, तो इन फ़ाइलों को ढूंढना बहुत आसान है। ध्यान दें कि PowerShell में, "dir" "Get-ChildItem" cmdlet के लिए एक अन्य नाम है।

सभी फ़ाइलों (निर्देशिकाओं / फ़ोल्डरों को नहीं) खोजने के लिए जिनके पास एक्सटेंशन है (उदाहरण के लिए "myfile.txt", लेकिन "FileWithNoExt" नहीं):

dir -af | Where {$_.Name -match "\."}

"-फिल" स्विच "-फाइल" के लिए शॉर्टहैंड है जो केवल फाइल में रिटर्न ऑब्जेक्ट्स को प्रतिबंधित करता है। "-द" को केवल निर्देशिका मिलेगी। "\"। का अर्थ है "एक शाब्दिक बिंदु चरित्र"। बैकलैश के बिना, मानक रेगेक्स के अनुसार, डॉट किसी भी वर्ण से मेल खाएगा।

उन सभी फ़ाइलों को प्राप्त करने के लिए जहां एक्सटेंशन के बिना नाम में डॉट था, साथ ही एक एक्सटेंशन (उदाहरण के लिए "myDocument_v1.1.doc" लेकिन "myfile.txt") नहीं:

dir -af | Where {$_.BaseName -match "\."}

हालाँकि, ध्यान दें कि यह पूर्ववर्ती डॉट के साथ ".archive" जैसे नाम वाली फ़ाइल को बाहर कर देगा। इसका कारण यह है कि इसे बिना आधार के और "संग्रह" के विस्तार के रूप में माना जाता है। यदि आप इन्हें शामिल करना चाहते हैं:

dir -af | Where {$_.BaseName -match "\.|^$"}

यहाँ, मैच पैटर्न कहता है "A शाब्दिक बिंदु, या (|) BeginningOfString (^) उसके बाद EndOfString ($) (यानी एक खाली स्ट्रिंग)"। चूँकि किसी फ़ाइल में खाली बेसन और एक्सटेंशन दोनों नहीं हो सकते हैं , यह फाइलों को डॉट के साथ शुरू करेगा।



-2

यदि आप कमांड के ऊपर टाइप करते हैं, तो यहां: * (यह एक वाइल्ड कार्ड है, जिसका मतलब है कि अक्षरों का कोई भी क्रम) जिसके बाद एक डॉट (।) लिखा जाता है। इसके बाद इसकी व्याख्या की जा सकती है, जैसे कि उन सभी फाइलों को दिखाया जाए, जिनका नाम है (वर्णों का कोई अनुक्रम) )। (पात्रों का कोई भी क्रम) जो आगे का अर्थ है कि सभी फाइलों को किसी भी एक्सटेंशन के साथ दिखाएं।


1
फिर Program Filesसूची में क्यों शामिल किया गया है? यह पैटर्न से मेल नहीं खाता <sequence of characters>.<sequence of characters>
गोनोस्तज

इसे शून्य या अधिक वर्णों के अनुक्रम के रूप में अधिक सोचें> यही कारण है कि यह ".info" नामक एक फ़ाइल भी उठाएगा जहां आधार नाम रिक्त है।
डेव_ जे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.