membuat rsync menunggu konfirmasi sebelum benar-benar mengubah file

10

Saya membuat sinkronisasi antara folder lokal dan remote. Kebetulan saya kehilangan satu file dengan perintah bodoh.

Saya terbiasa menyatukan dan dengan cara Anda mengkonfirmasi ("pergi?") Sebelum melakukan transfer file yang sebenarnya.

Apakah ada opsi seperti itu dengan rsync? (tidak serempak di sisi server)

Terima kasih!

meduz
sumber

Jawaban:

3

Sebagai pengganti opsi "--confirm" resmi, "mode batch" rsync sendiri dapat ditingkatkan untuk memotong tanpa harus menghitung dua kali perbedaan antara dua jalur. Mode batch dimaksudkan untuk mendistribusikan perubahan ke mirror (menghitung sekali, memperbarui banyak pohon identik). Dua file dibuat: file batch yang berisi pembaruan dan skrip kenyamanan sederhana untuk menjalankan pembaruan (ada bagian menjelang akhir halaman manual rsync dengan perincian).

Inilah bungkus bash untuk abstrak proses:

#!/bin/bash

cleanup ()
{
    rm ${BFILE} ${BFILE}.sh &>/dev/null
}

# generate tmpfile
BFILE=$( mktemp )

# rsync command
if ! rsync --only-write-batch="${BFILE}" --verbose "$@"; then
    cleanup
    exit 1
fi

# confirmation
read -p "Continue (y/N)? " confirm
if [ "$confirm" != "y" ]; then
    echo "Aborting"
    cleanup
    exit 1
fi

# carve up arguments
dest="${@: -1}"         # last argument
host="${dest%%:*}"      # host:path
path="${dest#*:}"
opts="${@:1:$(($#-2))}" # everything but the last two args
if [ "$host" = "${path}" ]; then
    # local
    sh "${BFILE}.sh"
else
    # remote
    ssh "$host" rsync --read-batch=- "${opts}" "${path}" <"${BFILE}"
fi

cleanup

Perhatikan bahwa sejak skrip ini ditulis $TMP_DIR, Anda mungkin mengalami kendala ruang jika Anda memindahkan data yang sangat besar (misalnya, lebih besar dari / tmp).

Steve
sumber
1
Apakah ini meminta konfirmasi untuk setiap file?
Sangat tidak teratur
2
Tidak, ini menghitung perubahan, menampilkannya, dan kemudian menampilkan satu prompt, "Lanjutkan (y / T)?" Sudah beberapa saat sejak saya menggunakan ini, tetapi IIRC, rsync sepertinya masih menghitung ulang rdiff.
Steve
6

Anda dapat menggunakan opsi -n dengan rsync untuk menjalankan proses kering. rsync akan memberi tahu Anda operasi apa yang akan dilakukan tanpa benar-benar melakukannya. Jika Anda puas dengan hasilnya, jalankan kembali tanpa opsi -n.

Mike Fitzpatrick
sumber
5

Sayangnya, tidak ada metode bawaan dalam Rsync pada saat penulisan.

Solusi Mike Fitzpatrick akan berfungsi dengan baik, namun jika Anda memiliki pohon direktori yang sangat besar, Anda mungkin ingin melakukan sesuatu yang tidak membuat rsync menelusuri semua file lagi

EDIT: Ada juga bug di mana ia tidak akan menghapus file tujuan ... semakin banyak saya melihatnya, solusi ini rusak ... Saya meninggalkannya karena dapat bekerja dalam kasus Anda dan juga jika seseorang ingin untuk memperbaikinya. Juga, seseorang harus mengirimkan permintaan fitur formal ke https://bugzilla.samba.org/enter_bug.cgi?product=rsync

Saya menulis skrip ini:

#! /bin/bash

# Make a temp file for storing the output of rsync

tmpfile=$( mktemp )  &&

# Do all the hard work ( get the list of files we need to update ), 
#  but dont actually change the filesystem

rsync --dry-run --out-format='RSYNC_CONFIRM %i %n%L' "$@" | grep RSYNC_CONFIRM | awk '{ print $3 }' > $tmpfile &&


# Output to the user what we propose to do
rsync --dry-run --itemize-changes --files-from=$tmpfile "$@" &&

# Alternatively, we could just output $tmpfile... but whatever...

read -p "Continue? (y/n)?" &&

if [[ $REPLY = [yY] ]]
then
{
  rsync --files-from=$tmpfile "$@"
}
fi

rm $tmpfile
  • Coba tempelkan skrip ke file bernama rsync-confirm.bash

  • Kemudian chmod +x rsync-confirm.bash

  • Kemudian ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

Script ini mungkin sedikit buggy, saya perhatikan bahwa itu tidak benar-benar menyukainya jika Anda tidak memiliki garis miring pada direktori sumber ...

Dave Butler
sumber
5

Anda dapat membuat rsync untuk membuat cadangan file saat ditimpa, menggunakan opsi --backup,

 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)

Setelah rsync dijalankan, Anda dapat memindai file cadangan-dir dan meminta satu per satu jika perlu dipulihkan.

zb '
sumber