GNU/Linux >> Belajar Linux >  >> Linux

bandingkan 2 direktori dan salin perbedaan di direktori ke-3

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.


Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Bash =~ Regex Dan Https://regex101.com/?

  3. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  1. Membuat, Menghapus, dan Mengelola Direktori di Linux

  2. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  3. Temukan Dan Perbedaan Antara -perm /6000 Dan -perm /u+s?

  1. Salin file dengan SCP dan Rsync

  2. Instal binari ke /bin, /sbin, /usr/bin dan /usr/sbin, interaksi dengan --prefix dan DESTDIR

  3. Ubah direktori dan jalankan file dalam satu perintah