Gunakan kembali rsync --dry-run output untuk mempercepat transfer yang sebenarnya nanti

23

Saya biasanya melakukan rsync -nsebelum melakukan yang sebenarnya rsync. Masalahnya adalah, bagaimana saya bisa mengotomatiskan jalankan kedua untuk menggunakan kembali daftar yang dibuat dengan tepat --dry-run?

Maksud saya, jika saya menjalankan rsync -nmaka saya mendapatkan simulasi dari apa yang rsyncakan dilakukan, ide saya adalah mengambil output itu, memprosesnya lalu entah bagaimana rsynchanya membuat --include-fromoutput itu, jadi daftar lengkap harus dihitung hanya sekali.

Jika ini bahkan tidak masuk akal, tolong beri tahu saya.

Ngomong-ngomong, saya cenderung menggunakan rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Jika Anda juga memiliki saran tentang opsi apa yang akan Anda gunakan, tolong, beri tahu saya. Saya mencoba menduplikasi konten hard drive eksternal (yang hanya berisi gambar, video, dan dokumen) ke hard drive eksternal lain.

Manuel
sumber
Anda dapat mencoba mengalihkan output dari --dry-runperintah ke file (misalnya, rsync --dry-run -avz SOURCE DEST > include.txt), menghapus semua baris yang bukan file / jalur dari include.txt, dan berjalan rsync --include-from include.txt.
ThatGuy
Perintah terakhir itu seharusnya rsync --include-from include.txt --exclude=* SOURCE DEST. Lihat stackoverflow.com/a/19296415/1765910 untuk detailnya.
ThatGuy
Ya, itulah idenya, tetapi saya tidak tahu bagaimana cara melakukan itu (ditambah saya ingin persetujuan dari seseorang yang benar-benar tahu apa yang dia lakukan). Saya hanya menggunakan rsynctetapi tidak tahu apa-apa dari skrip shell / bash ...
Manuel

Jawaban:

18

Sangat mungkin untuk menggunakan daftar file yang dihasilkan selama menjalankan kering sebagai file termasuk. Idealnya, bagaimanapun, garis tambahan di bagian atas dan bawah dari output dry-run harus dihapus.

Contoh output:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Untuk menghapus garis-garis ini, pipa rsyncoutput ke dalam headdan ke tail. Kemudian, simpan output yang diproses ke file include:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Akhirnya, beri tahu rsyncuntuk menggunakan file include yang dihasilkan (menambahkan opsi tambahan seperti yang diinginkan):

rsync --include-from=include.txt --exclude=* source/ dest/

Orang itu
sumber
Masalahnya adalah ini tidak mengatasi file yang harus dihapus. Dan apakah metode tail/ headcukup kuat untuk memastikan hanya memiliki daftar file?
Manuel
Menambahkan --deletemenyebabkan file dihapus dari direktori sumber untuk dihapus dari direktori tujuan juga, setidaknya di komputer saya mencobanya. Anda dapat meninggalkan keluar tail/ headbagian seluruhnya. rsyncmenginterpretasikan setiap baris dalam file sertakan sebagai nama file dan hanya mengabaikan file yang tidak ada, sehingga tidak ada yang akan terjadi jika Anda menyimpan baris tambahan (kecuali jika Anda memiliki file bernama "mengirim daftar file tambahan", dll., dalam hal ini file-file ini juga akan disalin).
ThatGuy