Jika saya menggunakan mv untuk memindahkan folder bernama "folder" ke direktori yang sudah berisi "folder" apakah akan digabung atau diganti?
Jawaban yang Diterima:
mv tidak dapat menggabungkan atau menimpa direktori, itu akan gagal dengan pesan “mv:tidak dapat memindahkan 'a' ke 'b':Direktori tidak kosong" , bahkan saat Anda menggunakan --force pilihan.
Anda dapat mengatasinya menggunakan alat lain (seperti rsync , find , atau bahkan cp ), tetapi Anda perlu mempertimbangkan implikasinya dengan cermat:
rsyncdapat menggabungkan konten dari satu direktori ke direktori lain (idealnya dengan--remove-source-filesopsi untuk menghapus hanya file sumber yang berhasil ditransfer dengan aman, dan dengan opsi izin/kepemilikan/pelestarian waktu yang biasa-ajika Anda mau)
… tetapi ini adalah operasi penyalinan penuh, dan oleh karena itu bisa sangat membutuhkan banyak disk.- Opsi pilihan saat ini: Anda dapat menggabungkan
rsync--link-dest=DIRopsi (untuk membuat hardlink alih-alih menyalin konten file, jika memungkinkan) dan--remove-source-filesuntuk mendapatkan semantik yang sangat mirip denganmvbiasa .
Untuk ini,--link-destperlu diberikan jalur absolut ke sumber direktori (atau jalur relatif dari tujuan ke sumber ).
… tetapi ini menggunakan--link-destdengan cara yang tidak disengaja (yang mungkin atau mungkin tidak menyebabkan komplikasi), memerlukan pengetahuan (atau menentukan) jalur absolut ke sumber (sebagai argumen untuk--link-dest), dan sekali lagi meninggalkan struktur direktori kosong untuk dibersihkan sesuai . - Anda dapat menggunakan
finduntuk membuat ulang struktur direktori sumber secara berurutan pada target, lalu pindahkan file sebenarnya satu per satu
… tetapi ini harus berulang melalui sumber beberapa kali dan dapat menghadapi kondisi balapan (direktori baru dibuat di sumber selama proses multi-langkah) cpdapat membuat tautan keras (sederhananya, penunjuk tambahan ke file yang ada yang sama), yang menciptakan hasil yang sangat mirip dengan penggabunganmv(dan sangat IO-efisien karena hanya pointer yang dibuat dan tidak ada data aktual yang harus disalin)
… tetapi ini lagi-lagi mengalami kemungkinan kondisi balapan (file baru di sumbernya dihapus meskipun tidak disalin pada langkah sebelumnya)
Manakah dari solusi ini (jika ada) yang sesuai akan sangat bergantung pada kasus penggunaan spesifik Anda.
Seperti biasa, pikirkan sebelum Anda menjalankan salah satu dari perintah ini, dan buat cadangan.
1:Perhatikan bahwa rsync --remove-source-files tidak akan menghapus direktori apa pun, jadi Anda harus melakukan sesuatu seperti find -depth -type d -empty -delete setelah itu untuk menyingkirkan pohon direktori sumber yang kosong.