वास्तव में फ़ाइलों को बदलने से पहले पुष्टि के लिए rsync की प्रतीक्षा करें


11

मैं एक स्थानीय और एक दूरस्थ फ़ोल्डर के बीच एक सिंक्रनाइज़ेशन बना रहा हूं। ऐसा हुआ कि मैं एक फ़ाइल बेवकूफ आदेश द्वारा खो दिया।

मैं वास्तविक फाइल ट्रांसफर करने से पहले आपको ("जाना?") पुष्टिकरण करने के तरीके के बारे में बताता हूं।

क्या rsync के साथ ऐसा कोई विकल्प है? (सर्वर साइड पर कोई सामंजस्य नहीं)

धन्यवाद!

जवाबों:


3

एक आधिकारिक "--confirm" विकल्प के बदले में, rsync के "बैच मोड" को दो रास्तों के बीच अंतर की गणना करने के लिए दो बार बायपास करने के लिए उत्तोलन किया जा सकता है। बैच मोड का उद्देश्य दर्पणों में परिवर्तन वितरित करना था (एक बार गणना करें, कई समान पेड़ों को अपडेट करें)। दो फाइलें बनाई गई हैं: अपडेट चलाने के लिए अद्यतन और एक साधारण सुविधा स्क्रिप्ट युक्त एक बैच फ़ाइल (इसमें विवरण के साथ rsync मैन पेज के अंत की ओर एक खंड है )।

यहाँ प्रक्रिया को अमूर्त करने के लिए एक बैश रैपर है:

#!/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

ध्यान दें कि चूंकि यह स्क्रिप्ट लिखता है $TMP_DIR, आप अंतरिक्ष की कमी में भाग सकते हैं यदि आप वास्तव में बड़ा डेटा (उदाहरण के लिए आपके / tmp से बड़ा) बढ़ रहे हैं।


1
क्या यह प्रत्येक फ़ाइल के लिए एक पुष्टि के लिए पूछता है?
अत्यधिक अनियमित

2
नहीं, यह परिवर्तनों की गणना करता है, उन्हें प्रदर्शित करता है, और फिर एक ही संकेत दिखाता है, "जारी रखें (y / N)?" यह थोड़ी देर के बाद से मैं इस का उपयोग किया है, लेकिन IIRC, rsync अभी भी rdiff पुनर्गणना करने के लिए लग रहा था।
स्टीव

7

आप सूखी रन करने के लिए rsync के साथ -n विकल्प का उपयोग कर सकते हैं। rsync आपको बताएगा कि वास्तव में उन्हें करने के बिना यह कौन से संचालन करेगा। यदि आप परिणामों से खुश हैं, तो बिना विकल्प के फिर से चलें।


7

आप ओवर-राइट विकल्प का उपयोग करके ओवरराइट पर बैकअप फ़ाइलों के लिए rsync बना सकते हैं,

 -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)

rsync चलाने के बाद आप फ़ाइलों के लिए बैकअप-डीआर को स्कैन कर सकते हैं और एक-एक करके पूछ सकते हैं कि क्या इसे पुनर्स्थापित करने की आवश्यकता है।


5

अफसोस की बात है कि समय लेखन में रुपये में कोई विधि नहीं बनी है।

माइक फिट्ज़पैट्रिक का समाधान ठीक काम करेगा, हालांकि अगर आपके पास बहुत बड़ी निर्देशिका का पेड़ है, तो आप कुछ ऐसा करना चाहते हैं जो rsync को फिर से सभी फाइलों के माध्यम से न जाने दें

संपादित करें: वहाँ भी एक बग है जहाँ यह एक गंतव्य फ़ाइल को नष्ट नहीं करेगा ... अधिक से अधिक मैं इसे देखता हूं, यह समाधान टूट गया है ... मैं इसे छोड़ रहा हूं क्योंकि यह आपके मामले में काम कर सकता है और अगर कोई चाहता है ठीक करना। इसके अलावा, किसी को https://bugzilla.samba.org/enter_bug.cgi?product=oorync पर एक औपचारिक सुविधा अनुरोध प्रस्तुत करना चाहिए

मैंने यह स्क्रिप्ट लिखी है:

#! /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
  • स्क्रिप्ट को फाइल में चिपकाने की कोशिश करें rsync-confirm.bash

  • फिर chmod +x rsync-confirm.bash

  • फिर ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

यह लिपि थोड़ी छोटी हो सकती है, मैंने देखा कि यह वास्तव में पसंद नहीं है यदि आपके पास स्रोत निर्देशिका पर अनुगामी स्लैश नहीं है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.