Perintah WinXP dir: ekstensi char 3 dan 4 sama?

3

Saya mencoba mencari pohon direktori secara rekursif untuk menemukan semua .asp file menggunakan perintah berikut:

dir *.asp /s

Untuk beberapa alasan, ini tidak hanya mengembalikan file asp, tetapi juga file aspx.

Bagaimana saya bisa memaksanya untuk mengabaikan file aspx?

chris
sumber

Jawaban:

5
dir /x

Untuk alasan kompatibilitas, Windows menghasilkan a 8,3 nama untuk setiap nama file yang panjang dibuat, dan kode pencocokan wildcard ( FindFirstFile() ) memeriksa kedua nama asli dan singkat. Menggunakan dir /x untuk melihat nama pendek apa yang ditugaskan untuk setiap file.

Bagian "ekstensi" dari nama 8.3 adalah selalu dibuat dengan hanya memotong ekstensi terakhir hingga paling banyak 3 karakter: .aspx untuk .ASP


Saat menggunakan sistem file NTFS, 8.3 nama penciptaan dapat dinonaktifkan di seluruh sistem menggunakan:

fsutil behavior set disable8dot3

Namun, ini tidak akan mempengaruhi ada nama. Kamu harus ganti nama setiap file dan kemudian ganti namanya kembali ke nama aslinya.


Lihat juga: Pencarian direktori di Windows Command Prompt menunjukkan output yang salah!

grawity
sumber
Nah, itu penjelasan yang cukup bagus tentang mengapa - tetapi sepertinya tidak ada cara untuk kemudian memaksa perintah dir untuk mengabaikan file aspx?
chris
1
@ Chris: Tidak. Tapi kamu juga bisa menghapus 8,3 nama dari sistem Anda (kemungkinan akan menghemat banyak masalah nanti), atau memfilternya dir output dengan dir /b/s *.asp | findstr /ile .asp - ini membuang garis yang tidak berakhir dengan .asp.
grawity
Menurut jawaban ini kamu bisa memakai fsutil 8dot3name strip directory untuk menghapus nama yang ada, tidak perlu mengubah nama mereka
phuclv
0

Tentu saja ini bervariasi sesuai dengan apa yang diperintahkan penerjemah DIR perintah yang digunakan. Itu DIR perintah di Take Command , sebagai contoh, hanya cocok dengan nama yang panjang secara default dan jadi tidak menunjukkan perilaku ini. ( Pencocokan nama pendek dan panjang dapat dihidupkan untuk kompatibilitas dengan CMD DIR perintah.) Jadi ada cara untuk mengatasi ini yang tidak memerlukan FSUTIL dan hak administrator.

JdeBP
sumber
0

Menarik - tampaknya menjadi bug ...

Mempertimbangkan, saya akan mengirimkan melalui find seperti:

dir /s *.asp | find /i /v ".aspx "
Multiverse IT
sumber
itu bukan bug, sesuai jawaban grawity. Tetapi mengapa Anda meninggalkan ruang di ujung aspx?
phuclv
1
@ phuclv, yang tertinggal ruang harus dihapus, karena itu menjadi bagian dari string pencarian sebaliknya; bagaimanapun, pendekatan ini juga akan mengecualikan file yang dimiliki .aspx suatu tempat di tengah nama mereka, seperti file.aspx.name.asp, yang seharusnya dimasukkan ...
aschipfl
0

Jika Anda memiliki PowerShell , kamu bisa memakai:

dir *.asp -r | remove-item

Jika Anda tidak memiliki PowerShell, mengapa tidak?

Peter Hahndorf
sumber
0

Sebagai pengguna grawity sudah mengatakan jawaban mereka , itu karena wildcard digunakan oleh cmd Perintah internal dan beberapa yang eksternal juga cocok 8.3 nama file , yang diaktifkan secara default.

Untuk mengatasinya, ada beberapa cara, beberapa di antaranya ingin saya tunjukkan:


Kamu bisa memakai findstr untuk memfilter nama file yang dikembalikan oleh dir:

dir /S /B /A:-D "*.asp" | findstr /IEC:".asp"

Ini bahkan tidak cocok dengan file yang dimiliki .asp suatu tempat di nama mereka (seperti file.asp.aspx ), juga tidak mengecualikan file yang memiliki .aspx dalam nama mereka (seperti file.aspx.asp ).

Tombol /B mari dir mengembalikan daftar murni nama file / jalur, yang dapat difilter dengan benar. Pilihan /A:-D tidak termasuk direktori yang cocok.


Atau, yang where perintah dapat digunakan, yang menangani wildcard berbeda dari dir:

where /R "." "*.asp"

Kerugiannya adalah bahwa perintah ini juga menganggap konten PATHEXT variabel, jadi ini juga akan cocok dengan file yang berakhiran .asp.exe, mengingat bahwa .EXE terkandung dalam PATHEXT; untuk menghindari itu, Anda dapat menghapus sementara PATHEXT variabel (oleh set "PATHEXT_BACKUP=%PATHEXT%" & set "PATHEXT=" ) dan pulihkan nanti (dengan set "PATHEXT=%PATHEXT_BACKUP%" & set "PATHEXT_BACKUP=" ).


Jawaban ini oleh pengguna Konrad menunjukkan cara untuk mengubah perilaku standar membuat 8,3 nama file item dengan ekstensi dengan lebih dari 3 karakter, yang pada gilirannya mencegah sebagian besar kecocokan yang tidak diinginkan tersebut. Namun sayangnya ini tidak mengubah nama file 8.3 saat ini. Dan tentu saja secara teoritis bisa ada situasi di mana nama file 8,3 masih cocok meskipun sangat tidak mungkin.

Saya harus mengakui bahwa saya belum menguji ini ...

aschipfl
sumber