ทำให้ rsync รอการยืนยันก่อนที่จะเปลี่ยนไฟล์จริง


10

ฉันกำลังซิงโครไนซ์ระหว่างโลคัลและโฟลเดอร์ระยะไกล มันเกิดขึ้นที่ฉันทำไฟล์เดียวหายโดยใช้คำสั่งโง่ ๆ

ฉันเคยพร้อมเพรียงและวิธีที่คุณยืนยัน ("go?") ก่อนทำการถ่ายโอนไฟล์จริง

มีตัวเลือกเช่น rsync หรือไม่ (ไม่พร้อมเพรียงทางฝั่งเซิร์ฟเวอร์)

ขอบคุณ!

คำตอบ:


3

แทนที่จะใช้ตัวเลือก "- ยืนยัน" อย่างเป็นทางการคุณสามารถยกระดับ "โหมดแบทช์" ของ rsync ได้เองเพื่อหลีกเลี่ยงการคำนวณความแตกต่างระหว่างสองเส้นทาง โหมดแบทช์มีไว้สำหรับการกระจายการเปลี่ยนแปลงไปยังมิรเรอร์ (คำนวณครั้งเดียวอัพเดทต้นไม้ที่เหมือนกันจำนวนมาก) สองไฟล์ที่สร้าง: ไฟล์ชุดที่มีการปรับปรุงและสคริปต์ความสะดวกสบายที่เรียบง่ายสำหรับการทำงานการปรับปรุง (มีส่วนในช่วงท้ายของหน้าคน rsyncมีรายละเอียด)

นี่คือ wrapper bash สำหรับสรุปกระบวนการ:

#!/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 อีกครั้ง
Steve

6

คุณสามารถใช้ตัวเลือก -n กับ rsync เพื่อดำเนินการแห้ง rsync จะบอกคุณว่าการดำเนินการที่มันจะได้ดำเนินการโดยไม่ได้ทำจริง หากคุณพอใจกับผลลัพธ์ให้เรียกใช้ซ้ำโดยไม่ใช้ตัวเลือก -n


5

น่าเศร้าที่ไม่มีวิธีการในตัวใน Rsync ในขณะที่เขียน

วิธีแก้ปัญหาของ Mike Fitzpatrick จะใช้ได้ดี แต่ถ้าคุณมีแผนผังไดเรกทอรีที่ใหญ่มากคุณอาจต้องการทำบางสิ่งที่ไม่ทำให้ rsync ผ่านไฟล์ทั้งหมดอีกครั้ง

แก้ไข: นอกจากนี้ยังมีข้อผิดพลาดที่จะไม่ลบไฟล์ปลายทาง ... ยิ่งฉันดูมันมากขึ้นโซลูชันนี้ก็พัง ... ฉันปล่อยให้มันเพราะมันอาจทำงานได้ในกรณีของคุณและถ้ามีคนต้องการ เพื่อแก้ไข นอกจากนี้บางคนควรส่งคำขอคุณสมบัติอย่างเป็นทางการไปที่https://bugzilla.samba.org/enter_bug.cgi?product=rsync

ฉันเขียนสคริปต์นี้:

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

สคริปต์นี้อาจมีข้อผิดพลาดเล็กน้อยฉันสังเกตว่ามันไม่ชอบถ้าคุณไม่มีเครื่องหมายทับในไดเรกทอรีต้นทาง ...


5

คุณสามารถสร้าง 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 แล้วคุณสามารถสแกนไฟล์สำรองข้อมูลและถามทีละไฟล์ว่าจำเป็นต้องกู้คืนหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.