Ada perbedaan mendasar antara kedua bentuk argumen ini. Dan penting untuk memahami apa yang sedang terjadi.
Dengan ../foldersource/.
argumen diteruskan tidak berubah ke perintah, apakah itu cp
atau rm
atau sesuatu yang lain. Terserah perintah apakah trailing dot itu memiliki semantik khusus atau unik yang berbeda dari konvensi Unix standar yang hanya menunjuk ke direktori tempatnya berada; keduanya rm
dan cp
tampaknya memperlakukannya sebagai kasus khusus.
Dengan ../foldersource/*
argumen pertama kali diperluas oleh shell before perintah bahkan pernah dieksekusi dan memberikan argumen apa pun. Jadi, rm
tidak pernah melihat ../foldersource/*
; ia melihat versi yang diperluas ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1
dan seterusnya. Ini penting karena sistem operasi membatasi jumlah argumen yang dapat diteruskan ke sebuah perintah, biasanya hanya beberapa ratus.
Saat Anda menyalin menggunakan cp -a source/* target/
Anda menyalin sebagian besar file dan direktori dari source
ke target
. Khususnya, item yang dikecualikan mungkin berupa file yang dimulai dengan titik (.
) di tingkat atas source
.
Pertimbangkan file-file ini (atau direktori) di source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
Saat Anda menyalin menggunakan cp -a source/. target/
Anda menyalin seluruh konten source
, termasuk item apa pun yang dimulai dengan titik (.
) ke target
Pertimbangkan file-file ini (atau direktori) di source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
Jika Anda menggunakan bash
, zsh
, Anda dapat menggunakan dotglob
opsi untuk mengubah arti dari *
sehingga menyertakan file dan direktori yang diawali dengan titik (yash
juga memiliki dotglob
pilihan; namun, itu kemudian menyertakan .
dan ..
dalam ekspansi glob yang membatasi kegunaannya. Lihat juga FIGNORE='@(.|..)'
di ksh93
).
Menariknya, cp -a source/. target/
dijamin tidak pernah untuk membuat komponen target/source
. (Di sisi lain, cp -a source target/
akan melakukan salah satu dari dua hal tergantung pada apakah target
atau tidak sudah ada. Lihat Cara menyalin folder secara rekursif dengan cara idempoten menggunakan cp untuk detailnya.)
Saat Anda menghapus menggunakan rm -rf source/*
Anda menghapus file dan direktori di dalam source
yang tidak dimulai dengan titik (.
). Tunduk pada dotglob
pengaturan yang telah saya sebutkan. Itu tidak akan menghapus direktori source
itu sendiri.
Saat Anda mencoba menghapus menggunakan rm -rf source/.
itu akan gagal - seperti yang telah dijelaskan orang lain - karena POSIX melarang penghapusan jalur yang komponen terakhirnya adalah .
atau ..
. Padanan terdekatnya adalah rm -rf source
, yang akan menghapus source
direktori dan semua isinya terlepas dari apakah dimulai dengan titik atau tidak (.
).
Anda tidak dapat melakukan rm -rf ../foldersource/.
karena rm
tidak mengizinkan ini, seperti yang dinyatakan secara eksplisit dalam manual:
Upaya apa pun untuk menghapus file yang komponen nama file terakhirnya adalah '.' atau '..' ditolak tanpa diminta, seperti yang diamanatkan oleh POSIX.
dan dalam manual POSIX man 1p rm
kita melihat:
Jika salah satu file dot atau dot-dot ditentukan sebagai bagian nama dasar dari sebuah operan (yaitu, komponen nama jalur terakhir) atau jika sebuah operan memutuskan ke direktori root, rm akan menulis pesan diagnostik ke kesalahan standar dan tidak melakukan apa pun dengan operan tersebut .