Saya hanya melakukan pengujian fungsionalitas terbatas, jadi harap berhati-hati dengan perintah ini (--dry-run):
rsync -avPr --ignore-existing --remove-source-files src/ dest
Harap perhatikan trailing / karena ini akan berulang ke src alih-alih menyalin src itu sendiri, ini harus mempertahankan jalur Anda yang sudah ada.
Dengan menggunakan flag --ignore-existing yang dikombinasikan dengan flag --remove-source-files, Anda hanya akan menghapus file dari src yang disinkronkan dari src ke dest, yaitu file yang sebelumnya tidak ada di dest saja.
Untuk menghapus file yang tidak disinkronkan, yaitu file yang sudah ada di dest/ seperti di src/, Anda dapat menggunakan:
for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done
atau
find src -type f -exec bash -c 'cmp -s "$0" "${0/#src/dest}" && rm "$0"' {} \;
jika nama file dapat berisi spasi putih/baris baru/...Mengenai komentar Gilles tentang karakter khusus, hal itu tentu saja harus diperhatikan dan ada banyak solusi, yang paling sederhana adalah dengan meneruskan -i ke rm yang akan meminta sebelum semua penghapusan. Asalkan src/, atau jalur induknya, disediakan untuk menemukan, bagaimanapun, jalur yang sepenuhnya memenuhi syarat harus menghasilkan semua nama file ditangani dengan benar oleh perintah diff dan rm tanpa mengutip.
serempak adalah alat yang Anda cari. Coba unison-gtk jika Anda lebih suka gui. Tapi menurut saya itu tidak akan menghapus file yang serupa:serempak coba agar kedua direktori identik. Namun demikian itu akan dengan mudah 1) mengidentifikasi file mana yang akan disalin; 2) mana yang membutuhkan penggabungan manual.
Skrip berikut harus melakukan hal-hal yang wajar. Itu memindahkan file dari sumber ke tujuan, tidak pernah menimpa file dan membuat direktori seperlunya. File sumber yang memiliki file berbeda yang sesuai di tujuan dibiarkan begitu saja, begitu pula file yang bukan file atau direktori biasa (mis. Tautan simbolik). File yang tersisa di sumber adalah file yang ada konfliknya. Hati-hati, saya belum mengujinya sama sekali.
cd src
find . -exec sh -c '
set -- "/path/to/dest/$0"
if [ -d "$0" ]; then # the source is a directory
if ! [ -e "$1" ]; then
mv -- "$0" "$1" # move whole directory in one go
fi
elif ! [ -e "$0" ]; then # the source doesn't exist after all
: # might happen if a whole directory was moved
elif ! [ -e "$1" ]; then # the destination doesn't exist
mv -- "$0" "$1"
elif [ -f "$1" ] && cmp -s -- "$0" "$1"; then # identical files
rm -- "$0"
fi
' {} \;
Pendekatan lain adalah dengan melakukan union mount satu direktori di atas yang lain, misalnya dengan funionfs atau unionfs-fuse.