Mengapa `dir *.*` beri aku semua file dan folder?

Ketika saya menjalankan dir *.* ini menghasilkan hasil yang tak terduga. Bahkan file dan folder tanpa titik di nama mereka terdaftar. Misalnya

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

Mengapa demikian? Apakah ada cara untuk daftar file hanya dengan sebuah titik?

Mengomentari pertanyaan (10)
Larutan

Saya menulis jawaban ini karena OP telah menekankan bahwa:

apa yang saya'm tertarik adalah why *.* pertandingan semua file, seperti yang dinyatakan dalam pertanyaan

The DIR perintah berasal dari waktu ketika:

  1. Titik (.) tidak diperbolehkan sebagai karakter dalam nama file atau folder
  2. Nama File dan folder dibatasi untuk 8 karakter untuk nama dan 3 karakter untuk ekstensi

Oleh karena itu, dengan standar itu, *.* berarti whatever nama dan apapun extension. Itu tidak berarti a string yang berisi ".", yang mungkin atau mungkin tidak memiliki karakter sebelum atau setelah ".".

Kebijakan Microsoft adalah menjaga kompatibilitas. Oleh karena itu, bahwa penafsiran *.* dipertahankan.

Tapi di Windows PowerShell, *.* berarti a string yang berisi ".", yang mungkin atau mungkin tidak memiliki karakter sebelum atau setelah ".".

Komentar (11)

Mengapa demikian?

Satu dapat menemukan jawaban untuk "Mengapa demikian?" di Wildcard artikel:

  • wildcard akan cocok dengan setiap urutan karakter (0 atau lebih, termasuk karakter NULL)

? wildcard akan cocok dengan satu karakter (atau NULL pada akhir nama file)

...

Wildcard sesuai aturan

  • * Umumnya cocok dengan 0 atau lebih karakter, dengan satu pengecualian (lihat aturan selanjutnya). Non-serakah wildcard adalah gratis untuk mencocokkan sebanyak atau sebagai beberapa karakter yang diperlukan untuk sisa masker untuk pertandingan.

  • *. Di akhir masker pertandingan setiap 0 atau lebih karakter kecuali untuk {dot}. Dalam kenyataannya, aturan ini berlaku dengan jumlah {dot} dan {spasi} karakter antara dan terminal {dot}. Biasa ekspresi untuk istilah ini adalah `"[][. ]*[.]$"`

  • ? Pertandingan 0 atau satu karakter, kecuali untuk {dot}. Satu-satunya waktu itu pertandingan 0 karakter adalah ketika pertandingan akhir nama, atau posisi sebelum {dot}. Tanda tanya juga dapat digunakan lebih dari sekali untuk mencocokkan lebih dari satu karakter.

Implikasi. Yang terakhir {dot} di file/folder nama memisahkan dasar nama dan ekstensi. Jadi

  • dir *. display semua barang dengan tidak ada ekstensi, dan
  • dir *.* menampilkan semua barang dengan ekstensi dari nol atau lebih karakter.

Tegasnya, dir *. display semua barang dengan tidak ada masa (.) nama. (BTW, [Penamaan File, Jalan, dan ruang Nama][2] MSDN artikel kata explicitly bahwa "hal ini dapat diterima untuk menentukan periode sebagai karakter pertama dari nama".)

Apakah ada cara untuk daftar file hanya dengan sebuah titik?

Saya don't pikir begitu. Namun, ada solusi dengan pas ekspresi reguler.

PowerShell (full lingkup solusi jika digunakan dalam Powershell konsol):

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

Cmd (ide saja, mungkin memerlukan beberapa elaborasi):

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

Tambahan: bonus dan penjelasan

Intuitif menebak bahwa Nama yang bersambung BaseName dan Ekstensi tidak tahan. Script berikut membuktikan hal itu dengan menggunakan cmd dan PowerShell fitur inti, dan aneh ^..*\...*$ regex adalah berasal dari it's hasil.

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

Output:

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

Bandingkan ** definisi BaseName akses yang berbeda untuk file dan folder:

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

Saya jawaban asli didasarkan pada dimaafkan kesalahpahaman:

<menyerang> Baca `dir /?`, gunakan `dir /A-D`:

/A Menampilkan file dengan atribut yang ditetapkan. atribut Direktori D R Read-only file H Hidden file Sebuah File yang siap untuk pengarsipan S Sistem file saya Tidak konten diindeks file L Reparse Poin - Awalan yang berarti tidak

Pendekatan lain: menerapkan findstr regex sebagai dir *.* | findstr /V "<.*>" </strike>

[2]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs. 85).aspx

Komentar (8)

Apakah ada cara untuk daftar file hanya dengan sebuah titik?

Anda dapat mencocokkan nama file dengan dot dengan menggunakan berdokumen wildcard <, yang cocok baik berurutan dari 0 atau lebih karakter dalam basename atau urutan 0 atau lebih karakter dalam ekstensi:


dir "
Komentar (1)

Baris Perintah Penerjemah akan melihat "." seperti "Semua dasar nama file" dengan "semua ekstensi". Kosong ekstensi masih ekstensi, sehingga akan dicocokkan dan kembali dengan daftar. Seperti yang sudah dijelaskan, ini adalah mabuk dari versi sebelumnya dari Windows dan MS-DOS.

Jika anda're senang untuk melihat menggunakan PowerShell, menemukan file-file ini adalah jauh lebih mudah. Perhatikan bahwa di PowerShell, "dir" adalah sebuah alias untuk "Get-ChildItem" cmdlet.

Untuk menemukan semua file (bukan direktori/folder) yang memiliki ekstensi (misalnya "myfile.txt", tetapi tidak "FileWithNoExt"):

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

"-af" switch merupakan singkatan dari " Berkas-" yang membatasi kembali benda-benda untuk file saja. "-ad" hanya akan mendapatkan direktori. "\." yang berarti "secara harfiah dot karakter". Tanpa backslash, dot akan cocok dengan karakter apapun, sesuai dengan standar regex.

Untuk mendapatkan semua file di mana ada sebuah titik dalam nama tanpa ekstensi, serta ekstensi (misalnya "myDocument_v1.1.doc" tetapi tidak "myfile.txt"):

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

Namun perlu dicatat, bahwa hal ini akan mengecualikan file dengan nama seperti ".arsip" dengan sebelumnya dot. Hal ini karena itu's diperlakukan sebagai tidak memiliki basename dan perpanjangan dari "archive". Jika anda ingin seperti ini:

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

Di sini, mencocokkan pola yang mengatakan "secara harfiah dot, ATAU(|) BeginningOfString(^) diikuti oleh EndOfString($) (yaitu string kosong)". Karena file bisa't memiliki kedua kosong basename dan perpanjangan, maka akan menemukan file yang dimulai dengan sebuah titik.

Komentar (1)

Jika anda mengetik perintah di atas, maka di sini:

  • (ini adalah kartu liar yang berarti setiap urutan karakter) diikuti dengan dot(.) diikuti oleh * ini bisa ditafsirkan sebagai menunjukkan semua file yang memiliki nama seperti (setiap urutan karakter).(setiap urutan karakter) yang artinya menunjukkan semua file dengan ekstensi apapun.
Komentar (2)