untuk menyalin konten dari folder yang telah saya baca, penggunaannya adalah:
cp -rfva ../foldersource/. ./
tapi ini juga berhasil
cp -rfva ../foldersource/* ./
apakah ada perbedaan?
dengan contoh jika saya ingin menghapus konten dari folder dengan. :
rm -rf ../foldersource/.
saya mendapatkan kesalahan:
rm: rejet delete folder '.' or '..':
tetapi dengan tanda bintang tidak apa-apa
rm -rf ../foldersource/*
jadi, asterisk adalah opsi yang lebih baik yang bekerja di mana saja?
It's up to the command whether that trailing dot makes any sense
Um, titik selalu terhubung ke direktori yang berisi itu sendiri, jadi../foldersource/.
seharusnya tidak berbeda dengan menyatakan./foldersource/
dan sebenarnya itu hanya cara yang berlebihan untuk menyatakan hal yang sama. Tidak ada perintah yang mencoba "memahami" dot atau double dot, karena ini adalah standar pada sistem file Linux / Unix.rm
cukup menolak menghapus direktori kerja saat ini seperti yangjimmij
dinyatakan dalam jawaban mereka. Perhatikan juga bahwa Anda menggunakan./
semua contoh Anda saat OP../
ada di sana. Agak dari perbedaan (besar).cp -rfva ../foldersource/. ./
TIDAK setara dengancp -rfva ../foldersource ./
. Trailing/.
signifikan.
merupakan konvensi standar dalam Unix untuk menunjukkan saat ini secara langsung. Juga, terima kasih telah menunjukkan bahwa saya telah menggunakan./
contoh saya ketika saya seharusnya menggunakannya../
; Saya akan memperbaikinya. Anda salah tentang apakah perintah "masuk akal" dari trailing dot; seperti yang ditunjukkan OP (dan saya alami dengancp
) keduanyarm
dancp
berperilaku berbeda ketika trailing.
hadir. Saya seharusnya menulis sesuatu seperti "terserah perintah jika trailing dot memiliki semantik khusus atau unik". Saya akan mengubah jawaban saya untuk kejelasan.Ketika Anda menyalin menggunakan
cp -a source/* target/
Anda menyalin sebagian besar file dan direktori darisource
ketarget
. Khususnya, item yang dikecualikan mungkin akan menjadi file yang dimulai dengan titik (.
) di tingkat atassource
.Pertimbangkan file-file ini (atau direktori) di
source
Ketika Anda menyalin menggunakan
cp -a source/. target/
Anda menyalin seluruh kontensource
, termasuk item yang dimulai dengan titik (.
) ketarget
Pertimbangkan file-file ini (atau direktori) di
source
Jika Anda menggunakan
bash
,,zsh
Anda dapat menggunakandotglob
opsi untuk mengubah arti*
sehingga menyertakan file dan direktori yang dimulai dengan titik (yash
juga memilikidotglob
opsi; namun, ia kemudian menyertakan.
dan..
dalam ekspansi glob yang membatasi kegunaannya. Lihat jugaFIGNORE='@(.|..)'
dalamksh93
).Menariknya,
cp -a source/. target/
dijamin tidak akan pernah membuat komponentarget/source
. (Di sisi lain,cp -a source target/
akan melakukan salah satu dari dua hal tergantung pada apakahtarget
sudah ada atau tidak . Lihat Cara menyalin folder secara rekursif dengan cara idempoten menggunakan cp untuk detailnya.)Ketika Anda menghapus menggunakan
rm -rf source/*
Anda menghapus file dan direktori di dalamnyasource
yang tidak dimulai dengan titik (.
). Tunduk padadotglob
pengaturan yang telah saya sebutkan. Itu tidak akan menghapus direktorisource
itu sendiri.Ketika Anda mencoba menghapusnya,
rm -rf source/.
ia akan gagal - seperti yang sudah dijelaskan orang lain - karena POSIX melarang penghapusan lintasan yang komponen terakhirnya.
atau..
. Setara terdekat adalahrm -rf source
, yang akan menghapussource
direktori dan semua kontennya terlepas dari apakah mereka memulai dengan titik (.
).sumber
rm -rf .
gagal .Anda tidak dapat melakukannya
rm -rf ../foldersource/.
karenarm
tidak mengizinkan ini, seperti yang dinyatakan secara eksplisit dalam manual:dan dalam manual POSIX
man 1p rm
kita melihat:sumber