Menjalankan ubuntu 12.04, saya ingin membandingkan 2 direktori, katakan folder1 / dan folder2 / dan salin semua file yang berbeda dengan folder3 /. Ada juga file bersarang, jadi subdirektori yang cocok juga harus disalin
Apakah ada satu perintah yang akan membantu saya? Saya dapat menjalankan daftar lengkap file yang diubah:
rsync -rcnC --out-format="%f" folder1/ folder2/
Tetapi rsync tampaknya tidak memiliki kemampuan untuk "mengekspor" file-file ini pada direktori target yang berbeda. Bisakah saya mem-pipe daftar ke cp atau program lain, sehingga file-file tersebut disalin, sementara direktori juga dibuat? Sebagai contoh, saya mencoba
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
tetapi itu tidak akan mempertahankan direktori juga, itu hanya akan menyalin semua file di dalam folder3 /
diff -qr
danawk
untuk membangun daftar, lalursync
...rsync --include-from=FILE
opsi.Jawaban:
Gunakan --compare-dest.
Dari halaman manual:
periksa dulu sintaks Anda dengan --dry-run
Kemudian setelah Anda puas dengan hasilnya:
tautan ini memiliki penjelasan yang bagus tentang lingkup --compare-dest.
sumber
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
di lokal saya dan rsync tidak mengerti~/
jalur untuk--compare-dest
param.--compare-dest
diperlukan jalur absolut.fonts/Makefile.in
file, yang identik di keduanyafolder2
danfolder1
dir.Skrip kecil ini harus berfungsi:
Tapi saya juga berpikir bahwa parsing output dari diff -qr akan menjadi solusi yang lebih baik karena memberikan Anda path dan nama untuk setiap file secara konsisten.
EDIT
Ini akan menjadi satu perintah, perintah Anda sedikit diubah. Tapi itu akan membuat di
folder1
bawahfolder3
. Dan itu tidak bekerja dengan path lengkap tetapi juga script di atas tidak bekerja dengan path penuh.Aku digunakan
\"
dalamrsync
untuk membuatnya bekerja dengan file dan direktori yang berisi kosong. Diuji pada Ubuntu 10,04. Semoga ini bisa membantu.sumber
Itu bentuk paling sederhana yang bisa saya buat, jika Anda bersedia turun lebih dulu
folder1
sebelum mengeluarkan perintah.Ini adalah opsi yang lebih lambat , tapi saya percaya ini memenuhi persyaratan Anda, dan itu bisa dieksekusi menggunakan nama direktori non-relatif:
Saya meninggalkan aslinya
rsync
perintah sendirian, karena Anda mengatakan itu memberi Anda daftar file yang benar (dan file pengujian saya jelas berbeda dari Anda, jadi saya tidak bisa mengatakan dengan pasti bahwa saya akan mendapatkan daftar file yang benar jika saya mengacaukan dengan itu).The
grep
ada untuk menghapus nama direktori dari output darirsync
.Output
grep
kemudian disalurkan ke yang lainrsync
menggunakanxargs
. Dalam paramfolder1/./{}
, extra./
digunakan untuk memberitahu rsync untuk membuat direktori relatif yang dimulai dengan./{}
, mengabaikanfolder1/
. Dengan kata lain, itu menghindari pembuatanfolder3/folder1/
.Saya hanya dapat menguji ini pada CentOS 6.4, tetapi AFAIK harus bekerja sama di Ubuntu 12.04.
EDIT: Saya harus mencatat bahwa jawaban smithian tidak diragukan lagi lebih baik, tetapi saya ingin mengambil tindakan keras dengan melakukan
rsync
perintah asli Anda dalam kebijaksanaan karena itu memberi Anda hasil yang diinginkan.sumber