Neden `dir *. *` Bana tüm dosya ve klasörleri veriyor?


62

Çalıştırdığımda dir *.*beklenmeyen sonuçlar veriyor. Adlarında herhangi bir nokta olmayan dosyalar ve klasörler bile listelenir. Örneğin

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

Neden? Yalnızca nokta noktalı dosyaları listelemenin bir yolu var mı?


19
Nokta her zaman oradadır, izleyen bir şey olmadığı sürece basılmaz. Başka bir deyişle, bir dosyanın "bu benim dosyam" olarak adlandırılabilir, ancak gizlice "Bu benim dosyam" adıdır. noktadan sonra hiçbir şey ile. Benzer şekilde, bu sitenin DNS adının "superuser.com" olduğunu düşünebilirsiniz, ancak aslında "superuser.com". ikinci noktadan sonra hiçbir şey olmadan.
Todd Wilcox

12
@ToddWilcox sadece DOS'ta doğrudur. Windows'daki modern dosya sistemlerinde artık ayrı bir uzantı ad alanı
bulunmuyor

13
@ LưuVĩnhPhúc Win32 alt sistemi , sonunda olduğu gibi birçok amaç için .sahip oldukları benzeri olmayan dosya adlarını ele alır ..
KodlarInChaos

2
.Karakteri içermeyen klasörlerin .sonunda bir zımni karakter vardır. - Örneğin, "Blah.old" adında bir klasöre sahip olabilirsiniz ve daha sonra geleneksel bir 3 harfli dosya uzantısı olacaktı; günden güne kullanım için olsa " Blah" aynı " Blah." aynı dosya veya klasör olsun.
BrainSlugs83

9
@ can-ned_food Todd Wilcox DNS konusunda haklı. Kök DNS bölgesine tam anlamıyla atıfta bulunulur .ve DNS adlarındaki etiketler ile ayrılır .(bu nedenle kök DNS bölgesinin adı tek bir sıfır uzunluklu etikettir). Kök DNS bölgesini biri çocuk .olduğunu com.ve bir çocuk com.olduğu superuser.com.vb, vb.
CVn

Yanıtlar:


115

Bu cevabı yazıyorum çünkü OP şunları vurguladı:

İlgilendiğim şey neden*.* soruda belirtildiği gibi tüm dosyalar ile eşleşiyor?

DIRKomut bir zaman geliyor:

  1. Döneme (.), Dosya veya klasör adlarında karakter olarak izin verilmedi.
  2. Dosya ve klasör adları ad için 8 karakter, uzantılar için 3 karakter ile sınırlandırıldı

Bu nedenle, bu standart, ad ve uzantı ne olursa olsun*.* anlamına gelir . Bu istemedim içeren bir dize bir " 'veya önceki veya sonraki karakterlerle olabilir veya olmayabilir hangi'." .

Microsoft ilkesi geriye dönük uyumluluğu koruyor. Bu nedenle, bu yorum *.*korunur.

Ancak Windows PowerShell'de, "." Öncesi veya sonrasında karakterleri olabilecek veya bulunmayabilecek "." İçeren bir dize*.* anlamına gelir . .



25
Orijinal dosya sistemi, periyodun kendisini diskte bile saklamadı, yalnızca adın kalanını oluşturan 11 karakter.
Bay Lister

7
Uzantı içermeyen dosya ve klasörlerin boş bir uzantı olarak kabul edilmeye değer olduğuna dikkat etmek önemlidir . Bu nedenle, " Folder." adlı bir klasör ve " Folder" adlı bir klasör , pencereler söz konusu olduğunda aynı adı taşır.
BrainSlugs83

2
@ MrLister İlginç. Eski FS, dosya adlarını AA.BBilk kısımda <8 ve uzantıdaki <3 gibi nasıl yaptı ? Sadece boşluklarla mı doldu?
Kelvin

3
@Kelvin evet, iki parça ayrı ayrı boşlukla dolduruldu.
plugwash

12

Neden?

Bir Wildcards makalesinde " Neden bu? " Diye bir cevap bulabiliriz :

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)

...

Joker karakter eşleştirme kuralları

  • *Genellikle, bir istisna dışında, herhangi bir 0 veya daha fazla karakterle eşleşir (sonraki kurala bakın). Açgözlü olmayan joker karakter, maskenin geri kalanının eşleşmesi için gerektiği kadar çok veya az karakterle eşleşebilir.

  • *.Maskenin sonunda, {dot} dışında herhangi bir 0 veya daha fazla karakterle eşleşir. Gerçekte, kural, * ve terminal {dot} arasında herhangi bir sayıda {dot} ve {space} karakteriyle uygulanır. Bu terim için normal ifade"[*][. ]*[.]$"

  • ?{Dot} dışında 0 veya bir karakter eşleştirin. 0 karakterle eşleştiği tek zaman, adın sonuna veya bir {dot} konumundan önceki konuma uymasıdır. Soru işareti, birden fazla karakter eşleştirmek için birden fazla kez kullanılabilir.

İma . Geçen bir dosya / klasör adı {nokta} ayıran temel adını ve uzantısını. Yani

  • dir *.uzantısı olmayan tüm öğeleri görüntüler ve
  • dir *.*sıfır veya daha fazla karaktere sahip tüm öğeleri görüntüler .

Kesin konuşursak, adlarında nokta ( ) olmayan tüm öğeleridir *. görüntüler . (BTW, Dosyalara, Yollara ve Ad Alanlarına Ad Verme MSDN makalesi, açıkça " bir adı bir adın ilk karakteri olarak belirtmenin kabul edilebilir olduğunu" söyler ..

Yalnızca nokta noktalı dosyaları listelemenin bir yolu var mı?

Sanmıyorum Ancak, uygun bir düzenli ifadeye sahip bir geçici çözüm vardır.

PowerShell (bir Powershell konsolunda kullanılıyorsa tam kapsamlı çözüm):

:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell -    extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"

Cmd (yalnızca bir fikir, biraz detaylandırma gerektirebilir):

:: 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

Zeyilname: ikramiye ve açıklama

NameBirleştirilmiş BaseNameve Extension tutmayan sezgisel bir tahmin . Aşağıdaki komut dosyası, onun kullanımını cmdve PowerShelltemel özelliklerini kanıtlar ve garip ^..*\...*$ regex, sonuçlarından elde edilir.

@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}"

Çıktı :

==> 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Özellik tanımını karşılaştırın , dosya ve klasörler için farklı:

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};}

Benim asıl cevap affedilmez yanlış anlama dayanıyordu:

Oku dir /?, kullan 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

Diğer bir yaklaşım: uygulamak findstrregex olarakdir *.* | findstr /V "<.*>"


ilgilendiğim şey, neden*.* soruda belirtildiği gibi tüm dosyalarla eşleşiyor
phuclv 28.07

I (Findstr) kullanılacak alternatif öneri bir ile başlayan klasörleri bulmazsa korkuyorum .gibi .dbus-keyrings, .VirtualBoxve .vscode.

22
Yani dir /A:-Dsadece mutlu dosyaları listeler?
Quentin

4
"Sadece nokta noktalı dosyaları listelemenin bir yolu var mı?" dir /A:-Dyanlış. 1 / uzantısız dosyaları listeler. 2 / .kendi adına sahip olan dizinleri listelemiyor (tamamen yasal)
DavidPostill

3
omg ... son ondan beri "@ echo off" u gördüm
rupps

7

Yalnızca nokta noktalı dosyaları listelemenin bir yolu var mı?

Temel addaki <0 veya daha fazla karakter dizisiyle eşleşen veya uzantıda 0 veya daha fazla karakter dizisiyle eşleşen belgelenmemiş joker karakterini kullanarak dosya adlarını bir noktayla eşleştirebilirsiniz :

dir "<.<"

Bunun <aynı zamanda bir meta karakter olduğunu da unutmayın , bu nedenle komut kabuğundan bir düzende kullanırken alıntı yapmanız veya kaçmanız gerekir.


1
mükemmel. Bu belgelenmemiş joker karakter gerçekten var
phuclv

1

Komut Satırı Yorumlayıcısı, " . " İfadesini "tüm uzantıları" olan "Tüm temel dosya adları" olarak görecektir . Boş bir uzantı hala bir uzantıdır , bu nedenle liste ile eşleştirilir ve döndürülür. Diğerlerinin de açıkladığı gibi, bu önceki Windows ve MS-DOS sürümlerinden bir akşamdan kalmadır.

PowerShell kullanarak bakmaktan memnunsanız, bu dosyaları bulmak çok daha kolaydır. PowerShell'de "dir", "Get-ChildItem" cmdlet'inin bir diğer adı olduğunu unutmayın.

Bir uzantısı olan tüm dosyaları (dizinler / klasörler değil) bulmak için (ör. "Myfile.txt", ancak "FileWithNoExt" değil):

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

"-af" anahtarı, dönüş nesnelerini sadece dosyalara kısıtlayan "-File" için kısayoldur. "-ad" sadece dizin alırdı. "\." "değişmez nokta karakteri" anlamına gelir. Ters eğik çizgi olmadan nokta, standart regex'e göre herhangi bir karakterle eşleşir.

Uzantı olmayan bir adın olduğu bir noktanın yanı sıra bir uzantı bulunan tüm dosyaları (ör. "MyDocument_v1.1.doc" ama "myfile.txt" değil) almak için:

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

Bununla birlikte, bunun bir önceki noktaya sahip ".archive" gibi bir dosya içermeyeceğini unutmayın. Bunun nedeni, bir temel adı ve "arşiv" uzantısı içermemesi olarak görülüyor. Bunları dahil etmek istiyorsanız:

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

Burada eşleşme kalıbı "Hazır bir nokta, OR (|) BeginningOfString (^), ardından EndOfString ($) (yani boş bir dize)" diyor. Bir dosya boş basename ikisine de sahip olamaz yana ve uzantısı, bir nokta ile başlayan dosyaları bulacaksınız.


PowerShell'de ls *.*yeter ki, diğerleri sizden önce cevapladı
phuclv

-2

Eğer yukarıdaki komutu yazarsanız, o zaman burada: * (bu, herhangi bir karakter dizisi anlamına gelen bir joker karakterdir) ve onu takip eden bir nokta (.) Ve ardından *, bu , karakterleri olan tüm dosyaları (karakter dizileri gibi) gösterdiği şeklinde yorumlanabilir . (. herhangi bir karakter dizisi) bu, başka bir uzantıya sahip tüm dosyaları gösteren anlamına gelir.


1
Öyleyse neden Program Fileslisteye dahil edildi? Desene uymuyor <sequence of characters>.<sequence of characters>.
gronostaj

Bunu daha fazla <Sıfır veya daha fazla karakter sırası> olarak düşünün. Bu nedenle, temel adın boş olduğu ".info" adlı bir dosyayı da seçti.
Dave_J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.