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:
rsync
dapat menggabungkan konten dari satu direktori ke direktori lain (idealnya dengan--remove-source-files
opsi untuk menghapus hanya file sumber yang berhasil ditransfer dengan aman, dan dengan opsi izin/kepemilikan/pelestarian waktu yang biasa-a
jika 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=DIR
opsi (untuk membuat hardlink alih-alih menyalin konten file, jika memungkinkan) dan--remove-source-files
untuk mendapatkan semantik yang sangat mirip denganmv
biasa .
Untuk ini,--link-dest
perlu diberikan jalur absolut ke sumber direktori (atau jalur relatif dari tujuan ke sumber ).
… tetapi ini menggunakan--link-dest
dengan 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
find
untuk 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) cp
dapat 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.