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?
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:
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 ".".
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, dandir *.*
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".)
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
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
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 "<.<"
Ingat bahwa <
juga merupakan metakarakter, sehingga anda perlu untuk mengutip atau melarikan diri setiap kali menggunakannya dalam pola dari command shell.
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.
Jika anda mengetik perintah di atas, maka di sini: