Apa perbedaan antara * dan *. * Saat menyalin?

19

Apa perbedaan antara 2 perintah berikut?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/
stany
sumber
12
Meskipun kedua jawaban itu benar, saya pikir ada satu hal yang perlu diperhatikan. File tersembunyi (file yang dimulai dengan .suka .bashrc) tidak disalin dengan salah satu dari perintah itu. Untuk menyalin file-file itu, Anda harus secara eksplisit menunjukkan bahwa dengan .*demikian, untuk menyalin semua file (termasuk yang tersembunyi) perintahnya adalahcp -rp /dir1/.* /dir1/* /dir2/
YoMismo
Singkatnya, *.*adalah cara MS-DOS / Windows melakukannya, sedangkan *cara UNIX / Linux. Di akhiran Unix (akhiran file, bagian setelah .- suka .txtatau .jpg) adalah opsional ... Di MS-DOS .(titik) dan akhiran diperlukan, jadi untuk mencocokkan semua file, satu digunakan *.*- sementara untuk mencocokkan semua file teks , orang akan menggunakan *.txt.
Baard Kopperud
Sufiks @ BaaKopperud tidak diperlukan, mungkin ada file dengan nama seperti FILENAMEatau bahkan FILE.
Ruslan
1
@Ruslan tetapi *.*dalam DOS masih cocok dengan file yang bernama FILENAMEatau FILE, karena namanya 'benar-benar' FILENAME.atau FILE.(dengan ekstensi kosong). Di Unix, namanya 'benar-benar' FILENAMEatau FILE, jadi *.*tidak akan cocok.
Jonathan Cast
1
@Ruslan Itu diperlukan pada DOS aktual, tidak diperlukan lagi di windows. Kembali di masa lalu , satu *hanya akan cocok FILE, dan tidak FILE.TXT .
Random832

Jawaban:

25

*.*hanya cocok dengan nama file dengan titik di tengah atau di akhir. Sebagai contoh:

abc.jpg
def. 

*cocok dengan nama file di atas, ditambah nama yang tidak memiliki titik sama sekali. sebagai contoh:

data
David Dai
sumber
6
Mungkin juga perhatikan bahwa anti-idiom *.*dulu cara yang benar untuk mencocokkan semua file di MS-DOS kembali pada hari 8 + 3 nama file. Dalam MS-DOS, titik itu wajib (walaupun implisit pada file yang tidak memiliki ekstensi).
tripleee
11
@Mark, Tidak, kurasa tidak. kecuali jika Anda memiliki dotglob.
David Dai
11
Huh, saya tidak pernah menyadari bahwa itu *.*cocok foo.tetapi tidak .foo. Asimetri itu mengerikan.
jamesdlin
9
@jamesdlin, dari manual bash: Saat sebuah pola digunakan untuk ekspansi nama file, karakter '.' di awal nama file atau segera setelah slash harus dicocokkan secara eksplisit, kecuali opsi shell dotglob diatur.
David Dai
1
@jamesdlin. Sejak hari pertama Unix (sekitar 1969), entri direktori yang dimulai dengan titik dianggap tersembunyi . Awalnya ini diperlukan untuk melewati entri .(direktori saat ini) dan ..(direktori induk) yang selalu ada di direktori mana pun (bahkan direktori kosong). Ritchie dan Thompson kemudian menganggapnya sebagai fitur yang berguna untuk menyembunyikan (secara default) semua .*rcfile konfigurasi dan menambahkan -aopsi eksplisit lsuntuk menampilkan semua entri "tersembunyi" ini. Jadi ini tidak terlalu mengejutkan mengetahui sejarah Unix. Titik terkemuka di Unix telah menjadi istimewa sejak "selamanya".
arielf
13

Misalkan Anda memiliki file berikut di /dir1:

foobar  
foo.bar  
fo.ba  
foo1.bar2  
foobar1  
foobar2  

cp -rp /dir1/*.* /dir2/

Perintah ini hanya akan menyalin file-file berikut:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Ini akan menyalin semua file /dir1

Kondisi ini berlaku untuk subdirektori /dir1juga ..

Tanah baru
sumber