Kembali pada 1990-an, saya akan menggunakan " *.*
" untuk mewakili nama file apa pun di MS-DOS, tapi saya sudah melihat lebih banyak skrip menggunakan " *
" saja belakangan ini. Apakah itu benar-benar membuat perbedaan mana yang saya gunakan?
command-line
Foebane
sumber
sumber
*
dan*.*
sekarang setara untukcmd
perintah internal dan utilitas baris perintah modern, beberapa utilitas yang lebih tua yang mengambil parameter mask file dapat menggunakan fungsi pencocokan file yang lebih lama, dan bagi mereka masker tidak akan setara.*.*
Token tidak harus kembali file extensionless.*.*
tidak boleh mengembalikan file tanpa ekstensi. Sayangnya itu terjadi. Lihat jawaban Grawity.Jawaban:
Nama file dan ekstensi telah menjadi bidang tunggal sejak Windows 95 dan NT 3.5 memperkenalkan dukungan "nama file panjang", dan kecocokan wildcard dilakukan terhadap seluruh nama file sekaligus. Akibatnya, Anda dapat memiliki nama file tanpa titik di dalamnya (mungkin jarang untuk file, tetapi sangat umum untuk folder / direktori) dan sekilas
*.*
tidak akan benar-benar cocok dengan file tersebut.Penggunaan skrip lama masih
*.*
akan berfungsi karena kode kompatibilitas - jika wildcard berakhir dengan.*
, bagian itu diabaikan oleh OS. (Jadi jika Anda ingin secara khusus mencocokkan file dengan ekstensi, saya kira Anda perlu*.?*
melakukannya.)Tapi itu bukan sesuatu yang harus Anda andalkan; jika Anda menulis skrip untuk versi Windows modern, ikuti konvensi mereka, bukan konvensi MS-DOS. (Perhatikan bahwa pada Windows NT, skrip .bat tidak ditafsirkan oleh MS-DOS lagi tetapi oleh
cmd.exe
, program Win32 asli.)Di Linux dan berbagai Unixen lainnya, nama & ekstensi tidak pernah terpisah sejak awal, dan tidak ada keajaiban khusus untuk
*.*
bekerja, jadi*
adalah satu-satunya pilihan yang masuk akal.sumber
*
hanya akan cocok dengan nama file tanpa ekstensi. Cara 'aman' agar kompatibel dengan keduanya adalah menggunakan**
.*
apakah ( secara default ) tidak cocok dengan nama file tersembunyi (dimulai dengan a.
).Itu mungkin layak disebutkan bahwa unixy yang / kerang posixy seperti shell Bourne, bash, ksh, zsh, dll melakukan ekspansi wildcard (karakter gumpal seperti
*
,?
,[range]
,[!range]
dan ekspansi lainnya seperti kawat gigi, dan gumpalan diperpanjang) untuk mengkompilasi daftar argumen sebelum perintah dieksekusi. Jadi ekspansi ini dilakukan oleh shell bukan perintah yang menjadi argumennya.yaitu Shell bertanggung jawab atas apa
*
,*.*
memperluas keIni bukan kasus dalam CMD (dan juga untuk utilitas powershell ) karena ia meneruskan karakter glob secara verbatim ke dalam perintah yang dieksekusi - dan karenanya ekspansi adalah tanggung jawab perintah / utilitas dan bukan pada shell. Jadi pada akhirnya, apa
*.*
atau apa*
yang tersisa untuk utilitas membiarkannya untuk menyesuaikan (atau tidak) dengan konvensi - itulah sebabnya utilitas CMD sepertidir *.*
juga cocok (bisa dibilang salah mempertahankan harapan) file tanpa ekstensi.Saya percaya aman untuk merangkum dengan cara ini.
sumber
FindFirstFile
itu sendiri adalah mode pengguna (baik kernel32.dll dan ntdll.dll adalah pustaka mode pengguna - itu adalah bagian dari subsistem Win32, bukan kernel), tetapi tidak benar-benar berbuat banyak.mmv "fred.*" "tom.#1"
. (Pengganti menggunakan#1
bukan*
, yang memiliki keuntungan membiarkan Anda memesan ulang bidang).mmv
tidak diinstal secara default pada sebagian besar sistem, tetapi alat batch-rename sering. Lihat artikel ini tentang itu , dan stackoverflow.com/questions/417916/how-to-do-a-mass-rename .