Apa nama simbol *. *?

Jawaban:

20

Interpretasi di *.*bawah sistem Windows / DOS lama

Arti penting di sini lebih terkait dengan Windows / DOS daripada Unix / Linux. Pada sistem Windows / DOS lama itu adalah pola 'wildcard'. Pola wildcard digunakan untuk mencocokkan nama file dengan cara yang mirip dengan gumpalan Unix. The *.*wildcard umumnya digunakan untuk mencocokkan file apapun.

Seperti halnya glob Unix, ia *akan cocok dengan urutan karakter apa pun dalam nama file, karena itu *sendiri akan cocok dengan file apa pun. Namun alasan mengapa *.*akan cocok dengan nama file apa pun juga adalah karena perbedaan dalam cara kerja wildcard ini. Menurut artikel ini :

Karakter apa pun selain titik yang muncul setelah tanda bintang tidak memiliki efek, karena tanda bintang memindahkan kursor ke posisi 12, di mana titik tidak mengubah keadaan parse kecuali titik, yang membersihkan tiga posisi terakhir dan memindahkan kursor.

Perilaku ini (agak ganjil dari perspektif Unix) berarti bahwa titik yang mengikuti *tidak benar-benar cocok dengan titik, tetapi hanya cara peretasan untuk memungkinkan Anda menambahkan lebih banyak karakter ke pola. Ini berarti bahwa menambahkan yang lain *akan cocok dengan apa pun di tiga posisi terakhir ini.

Ini lebih masuk akal ketika Anda mempertimbangkan bahwa sintaks digunakan pada DOS dan sistem Windows lama sebelum Windows 95 yang membutuhkan nama file 8,3 . Nama file ini hanya boleh memiliki satu titik dan paling banyak tiga karakter mengikuti titik tersebut. Sebagian besar, jika tidak semua file pada sistem akan memiliki ekstensi tiga karakter (meskipun secara teknis ekstensi lebih pendek atau tidak diizinkan), jadi entah bagaimana saya kira itu masuk akal untuk digunakan *.*untuk mencocokkan file apa pun (setidaknya dari perspektif logika Windowsey yang bengkok). ).

Interpretasi *.*dalam shell Unix

Dalam shell Unix, seperti yang telah ditunjukkan orang lain, ini mewakili 'ekspansi pathname' atau 'glob.' Tidak *ada yang aneh melompat ke perilaku akhir dan dengan demikian tidak menyebabkan karakter yang mengikutinya diabaikan. *.*pola akan cocok dengan nama file yang mengandung titik (kecuali di awal). Ini pasti tidak akan cocok dengan file apa pun karena ada banyak file di sistem Unix / Linux yang tidak memiliki ekstensi (atau mengandung titik karena ini juga diperbolehkan).

Alasan untuk *.*tidak mencocokkan titik di awal nama file di Unix adalah karena meletakkan titik di awal adalah bagaimana file 'tersembunyi' dan file tersembunyi secara default dikeluarkan dari gumpalan. Untuk mencocokkannya dalam shell POSIX, sebuah titik harus diletakkan secara eksplisit di awal pola. Dalam bashsatu dotglobopsi shell dapat diatur atau GLOBIGNOREvariabel dapat diatur dengan tepat, tapi ini adalah pertanyaan lain!

Graeme
sumber
1
Perlu dicatat bahwa versi Windows saat ini tampaknya berperilaku lebih logis. Secara khusus, "Karakter apa pun selain titik yang muncul setelah tanda bintang tidak memiliki efek" tidak benar lagi; setidaknya ketika memfilter file dalam dialog Open File standar pada Windows 7 dengan polanya *7.*, dapatkan semua file yang karakter terakhir sebelum ekstensi adalah a 7, dan dengan *sa*, saya mendapatkan semua file yang berisi substring sadi mana saja di sana nama file, dan sebagainya. (Dengan demikian, artikel yang Anda mengutip berjudul Bagaimana melakukan wildcard bekerja di MS-DOS ? (Penekanan ditambahkan sendiri).)
ATAU Mapper
1
@ORMapper, perbarui header untuk mencerminkan ini. Perilaku ini pra Windows 95, yang ada di jawaban (meskipun header itu menyesatkan).
Graeme
11

Ada globdi bash, Di bawah ini saya kutip dari bash manual:

bash - GNU Bourne-Again SHell

*

Cocok dengan sembarang string, termasuk string nol. Ketika opsi shell globstar diaktifkan, dan *digunakan dalam konteks ekspansi pathname, dua bersebelahan yang *sdigunakan sebagai pola tunggal akan cocok dengan semua file dan nol atau lebih direktori dan subdirektori. Jika diikuti oleh a /, dua yang berdekatan *shanya akan cocok dengan direktori dan subdirektori.

Dalam hal ini, *.*cocokkan semua file yang mengandung titik .pada namanya.

Anda dapat melihat detail lebih lanjut di sini .

cuonglm
sumber
8

Tanda bintang *adalah globbahasa shell. Mengutip dari Bahasa Perintah Shell :

Tanda bintang ( '*') adalah pola yang cocok dengan string apa pun, termasuk string nol.

Namun, itu tidak cocok dengan nama file yang dimulai dengan .kecuali jika opsi shell dotglobdiatur.

Saat Anda menggunakannya *.*, itu cocok dengan apa pun yang:

  • tidak dimulai dengan a .
  • mengandung setidaknya satu .

Anda mungkin juga ingin merujuk ke Ekspansi Nama File di manual.

devnull
sumber
6

Banyak orang yang berasal dari Windows berpikir *.*untuk semua file. Di Windows, itu. Di UNIX, itu semua file yang mengandung setidaknya 1 titik dalam namanya. *dengan sendirinya berfungsi dengan baik di Windows (berasal dari DOS awal); Namun buku-buku teks lama diterbitkan *.*dan tampaknya menjadi kebiasaan yang sulit untuk dihentikan.

Joshua
sumber
4

*adalah wildcard yang digunakan oleh shell untuk melakukan ekspansi nama file , juga dikenal sebagai "globbing". *meluas ke apa pun, termasuk tidak ada (misalnya, *.*akan cocok file., dll.). Wildcard umum lainnya adalah ?, yang cocok dengan karakter apa pun.

Jangan bingung fungsi wildcard ini dengan penggunaan karakter yang sama dalam ekspresi reguler (seperti yang digunakan dengan grep).

goldilocks
sumber
3

Itu adalah bintang-bintang-bintang - setidaknya, di dunia DOS (dan kemudian, tentu saja, Windows). Dalam DOS, titik .memiliki makna magis khusus, karena nama file adalah basis delapan karakter (kemudian diperpanjang, tetapi mari kita tetap sekolah lama) dan ekstensi tiga karakter (yang menentukan jenis file). Di Unix, tipe file biasanya ditentukan oleh dua byte pertama dari file (atau sihir lainnya), dan ekstensi itu informatif tetapi tidak memiliki banyak arti. Kecuali saat semua ini menjadi kabur.

Jadi, di Unix, tidak ada arti khusus. Tanda bintang adalah karakter "menggumpal" di shell Unix dan wildcard untuk sejumlah karakter (termasuk nol). ?adalah karakter globbing umum lainnya, cocok dengan persis salah satu karakter apa pun.

*.*cocok dengan semua nama file yang mengandung setidaknya satu .. Itu tidak memiliki nama khusus atau makna apa pun lebih dari *a*atau *_*. Dan *.?akan mencocokkan file apa pun dengan titik dan tepat satu karakter setelah titik itu. Ada juga beberapa pola globbing diperpanjang yang lebih rumit - lihat halaman manual shell Anda.

"Kamus Peretas Baru" (perluasan dari MIT "File Jargon" lama) mencatat bahwa "bintang" adalah nama yang paling umum untuk *simbol (diikuti oleh splat), dan saya pikir itu masih benar dalam praktiknya, dan .sudah pasti umum " dot ", jadi, meskipun tidak memiliki makna khusus intrinsik sebagai simbol konglomerasi, urutannya masih cukup disebut star-dot-star di Unix. (Itu hanya kurang bermanfaat.)

mattdm
sumber
Ini mungkin terdengar aneh tapi terima kasih telah menyebutkan "star dot star", itulah yang membuat halaman ini dapat di-googleable!
Score_Di Bawah
3

Di sini sebenarnya ada 2 simbol, tanda bintang *dan titik .. Kerang biasanya hanya menafsirkan tanda bintang sebagai karakter apa pun, tetapi dalam regex itu berarti gumpalan serakah. Dalam hal ini akan cocok dengan apa pun yang tidak berakhir atau dimulai dengan titik, tetapi mengandung setidaknya satu:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
Braiam
sumber
1
Kasing Anda onlydotatend.cocok, tentunya?
Graeme
@Graeme nggak. touch 'onlydotatend.' && echo *.*tidak mengembalikannya
Braiam
1
Apakah untuk saya! Pada keduanya bashdan dash. Shell apa yang Anda gunakan?
Graeme
@ Greme zsh, dan Anda benar bash tidak.
Braiam
Saya baru saja mencoba ini pada zshkonfigurasi vanilla dan berfungsi juga di sana. Saya tidak mengerti bagaimana onlydotatend.tidak bisa cocok, apakah ada opsi konfigurasi yang melakukan ini?
Graeme