bandingkan 2 direktori dan salin perbedaan di direktori ke-3


32

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 /


Saya mungkin akan menggunakan beberapa kombinasi diff -qrdan awkuntuk membangun daftar, lalu rsync...
ewwhite

bagaimana saya menggunakan rsync dengan daftar?
periklis

Saya akan menjalankan for-loop atau menggunakan rsync --include-from=FILEopsi.
ewwhite

(jangan malas ...) Tapi solusi rsync di bawah ini elegan.
ewwhite

Jawaban:


38

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 dalam direktori tujuan). Jika file ditemukan dalam DIR yang identik dengan file pengirim, file tersebut TIDAK akan ditransfer ke direktori tujuan. Ini berguna untuk membuat cadangan file adil yang telah berubah dari cadangan yang 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 lingkup --compare-dest.


1
Terima kasih untuk ini, saya tidak mengerti penjelasan halaman manual dari parameter ini. Bagi siapa pun yang tertarik, saya melakukannya denganrsync -rcC --compare-dest=folder2/ folder1/ folder3/
periklis

catatan cepat untuk pengguna OsX. Saya miliki rsync version 3.1.1 protocol version 31di lokal saya dan rsync tidak mengerti ~/jalur untuk --compare-destparam.
Jevgeni Smirnov

4
Bagi saya, --compare-destdiperlukan jalur absolut.
palswim

Tidak berfungsi untuk saya dengan opsi penulis atau OP. Yaitu menghasilkan fonts/Makefile.infile, yang identik di keduanya folder2dan folder1dir.
Hi-Angel

3

Skrip kecil ini harus 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 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 folder1bawah folder3. Dan itu tidak bekerja dengan path lengkap tetapi juga script di atas tidak bekerja dengan path penuh.

rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/

Aku digunakan \"dalam rsyncuntuk membuatnya bekerja dengan file dan direktori yang berisi kosong. Diuji pada Ubuntu 10,04. Semoga ini bisa membantu.


terima kasih untuk ini, saya berharap bahwa satu perintah akan ada
periklis

2
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/

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:

rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/

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 grepada untuk menghapus nama direktori dari output darirsync .

Output grepkemudian disalurkan ke yang lain rsyncmenggunakan xargs. Dalam param folder1/./{}, extra ./digunakan untuk memberitahu rsync untuk membuat direktori relatif yang dimulai dengan ./{}, mengabaikan folder1/. Dengan kata lain, itu menghindari pembuatan folder3/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 rsyncperintah asli Anda dalam kebijaksanaan karena itu memberi Anda hasil yang diinginkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.