Situasi 1
Bagaimana cara menyalin /home/src/somedir
ke /dest/
sehingga jalan selalu berakhir sebagai /dest/somedir
, terlepas dari apakah /dest/somedir
sudah ada?
Saya ingin menghindari berakhir dengan /dest/somedir/somedir
.
Situasi 2
Bagaimana cara menyalin segala sesuatu di dalam /home/src/somedir
untuk /dest/
sehingga /dest/somedir
tidak diciptakan dan diabaikan jika sudah ada?
Apakah ada aturan tentang garis miring yang dapat saya gunakan? Saya pikir mengakhiri dengan garis miring berarti selalu menyalin isinya saja tetapi masih sering salah bagi saya.
cp -r /home/src/somedir /dest/
harus mengatasi kedua situasi, baik membuat atau menggabungkan ke folder yang adacp
? Mungkin ada opsi yang benar untukrsync
melakukan ini.Jawaban:
cp
akan selalu menyalin file pada awal perintah ke file atau direktori pada akhir perintah. Slash tidak terlalu berpengaruh pada argumen, kecuali argumennya adalah symlink ke direktori. Kemudian memiliki garis miring akan memperlakukannya seperti direktori sementara menghilangkan garis miring akan menyalin tautan itu sendiri.Dengan asumsi Anda ingin menyalin secara berulang subdirektori dalam contoh Anda, Anda akan menyukainya seperti:
dan
Yang pertama mendapatkan direktori
/home/src/somedir
dan akan menyalin argumen itu, direktori itu sendiri dan semua isinya, ke argumen terakhir/dest
,. Ini akan membuatsomedir
direktori/dest
jika diperlukan dan menggunakannya jika sudah ada.The addes kedua
*
sampai akhir argumen pertama, yang shell akan memperluas untuk menjadi setiap file yang tidak dimulai dengan.
di/home/src/somedir
dan akan menyalin semua file-file dan direktori untuk/dest
tanpa memperhatikan apa yang sudah ada (kecuali beberapa bendera untukcp
akan membuatnya meminta untuk menimpa file yang akan memiliki yang sama di dalam tujuan sebagai file yang ada).Seperti komentar yang ditunjukkan oleh jawaban ini, ada masalah dalam menggunakan
*
untuk mengambil semua file di direktori. Salah satu alternatif adalah menggunakantar
salinan untuk Andaini akan membuat file tar
somedir
tanpa lintasan terkemuka dengan menggunakan-C
untuk beralih ke direktori itu terlebih dahulu. Secara defaulttar
akan mencetakstdout
yang kemudian kami pipa ke yang laintar
untuk mengekstraknya beralih ke/dest
direktori yang diinginkan terlebih dahulu. Ini juga akan mempertahankan banyak atribut file, yangcp
dapat melakukannya juga.sumber
*
ekspansi wildcard akan gagal jika ada terlalu banyak pertandingan. Saya tidak tahu angka pastinya, tetapi terakhir kali saya gagal, direktori tersebut memuat sekitar 100.000 file / direktori.*
cp
tetapi harus menyelesaikan tugascp -rv /home/src/somedir /dest
Kami menyalin «somedir» ke «/ dest», jadi kami berakhir dengan «/ dest / somedir»
cp -rv /home/src/somedir/* /dest
Kami menyalin «semua file di somedir» (
somedir/*
) ke «/ dest»Peringatan: somedir / * tidak termasuk file tersembunyi (yang diawali dengan titik).
Garis miring terakhir tidak memengaruhi proses. Anda mungkin bingung
cp
denganrsync
, di mana garis miring berarti "menyalin konten, bukan folder".sumber