Solusi 1:
Gunakan --compare-dest.
Dari halaman manual:
--compare-dest=DIR - Opsi ini menginstruksikan rsync untuk menggunakan DIR pada mesin tujuan sebagai hierarki tambahan untuk membandingkan file tujuan dengan melakukan transfer (jika file tidak ada di direktori tujuan). Jika file ditemukan di DIR yang identik dengan file pengirim, file tersebut TIDAK akan dipindahkan ke direktori tujuan. Ini berguna untuk membuat cadangan jarang dari file yang telah diubah dari cadangan sebelumnya.
periksa dulu sintaks Anda dengan --dry-run
rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/
Kemudian setelah Anda puas dengan hasilnya:
rsync -aHxv --progress --compare-dest=folder2/ folder1/ folder3/
tautan ini memiliki penjelasan yang bagus tentang --compare-dest scope.
Solusi 2:
Skrip kecil ini seharusnya berfungsi:
folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n" $folder1 $folder2`
do
if [ -d "$folder1/$x" ]; then
mkdir -p "$folder3/$x"
else
cp -frv $folder1/$x $folder3/$x
fi
done
Tapi saya juga berpikir bahwa parsing output dari diff -qr akan menjadi solusi yang lebih baik karena memberi Anda path dan nama untuk setiap file secara konsisten.
EDIT
Ini akan menjadi satu perintah, perintah Anda sedikit dimodifikasi. Tapi itu akan membuat folder1
di bawah folder3
. Dan itu tidak berfungsi dengan jalur lengkap tetapi skrip di atas juga tidak berfungsi dengan jalur lengkap.
rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/
Saya menggunakan \"
di rsync
untuk membuatnya berfungsi dengan file dan direktori yang berisi kosong. Diuji pada Ubuntu 10.04. Semoga membantu.
Solusi 3:
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/
Itu adalah bentuk paling sederhana yang bisa saya buat, jika Anda bersedia turun terlebih dahulu ke folder1
sebelum mengeluarkan perintah.
Ini lebih lambat opsi, tetapi saya yakin ini memenuhi persyaratan Anda, dan dapat dijalankan menggunakan nama direktori non-relatif:
rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/
Saya meninggalkan rsync
asli Anda perintah saja, karena Anda mengatakan itu memberi Anda daftar file yang benar (dan file pengujian saya jelas berbeda dari milik Anda, jadi saya tidak dapat mengatakan dengan pasti bahwa saya akan mendapatkan daftar file yang benar jika saya mengacaukannya).
grep
apakah ada untuk menghapus nama direktori dari output rsync
.
Output dari grep
kemudian disalurkan ke rsync
lainnya menggunakan xargs
. Di param folder1/./{}
./
ekstra digunakan untuk memberi tahu rsync untuk membuat direktori relatif yang dimulai dengan ./{}
, abaikan folder1/
. Dengan kata lain, ini menghindari pembuatan folder3/folder1/
.
Saya hanya dapat menguji ini di CentOS 6.4, tetapi AFAIK seharusnya bekerja sama di Ubuntu 12.04.
EDIT: Saya harus mencatat bahwa smithian Jawabannya tidak diragukan lagi lebih baik, tetapi saya ingin mencoba melakukannya dengan rsync
asli Anda perintah dengan bijaksana karena memberi Anda hasil yang diinginkan.