làm cho rsync chờ xác nhận trước khi thực sự thay đổi tập tin


11

Tôi đang thực hiện đồng bộ hóa giữa một thư mục cục bộ và từ xa. Nó xảy ra rằng tôi bị mất một tập tin bởi một lệnh ngu ngốc.

Tôi đã quen với việc đồng nhất và theo cách bạn xác nhận ("đi đâu?") Trước khi thực hiện chuyển tập tin thực tế.

Có một tùy chọn như vậy với rsync? (không có unison ở phía máy chủ)

Cảm ơn!

Câu trả lời:


3

Thay cho tùy chọn "xác nhận" chính thức, "chế độ hàng loạt" của rsync có thể được tận dụng để bỏ qua việc phải tính hai lần chênh lệch giữa hai đường dẫn. Chế độ hàng loạt được dự định để phân phối các thay đổi cho gương (tính toán một lần, cập nhật nhiều cây giống hệt nhau). Hai tệp được tạo: một tệp bó chứa các bản cập nhật và tập lệnh tiện lợi đơn giản để chạy bản cập nhật (có một phần ở cuối trang man rsync có chi tiết).

Đây là một trình bao bọc bash để trừu tượng hóa quá trình:

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

Lưu ý rằng vì tập lệnh này ghi vào $TMP_DIR, bạn có thể gặp phải các hạn chế về không gian nếu bạn đang di chuyển dữ liệu thực sự lớn (ví dụ lớn hơn / tmp của bạn).


1
Điều này có yêu cầu xác nhận cho mỗi tập tin không?
Rất không thường xuyên

2
Không, điều này sẽ tính toán các thay đổi, hiển thị chúng và sau đó hiển thị một dấu nhắc duy nhất, "Tiếp tục (y / N)?" Đã được một thời gian kể từ khi tôi sử dụng nó, nhưng IIRC, rsync dường như vẫn tính toán lại thông số.
Steve

7

Bạn có thể sử dụng tùy chọn -n với rsync để thực hiện chạy khô. rsync sẽ cho bạn biết những hoạt động mà nó sẽ thực hiện mà không thực sự thực hiện chúng. Nếu bạn hài lòng với kết quả, hãy chạy lại mà không có tùy chọn -n.


7

Bạn có thể tạo rsync để sao lưu các tệp khi ghi đè, sử dụng tùy chọn --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)

Sau khi rsync chạy, bạn có thể quét sao lưu-dir cho các tệp và hỏi từng cái một nếu nó cần được khôi phục.


5

Đáng buồn thay, không có phương thức được xây dựng trong Rupync tại thời điểm viết.

Giải pháp của Mike Fitzpatrick sẽ hoạt động tốt, tuy nhiên nếu bạn có một cây thư mục rất lớn, bạn có thể muốn làm điều gì đó không khiến rsync đi qua tất cả các tệp một lần nữa

EDIT: Cũng có một lỗi trong đó nó sẽ không xóa một tệp đích ... tôi càng nhìn vào nó, giải pháp này bị hỏng ... Tôi sẽ bỏ nó vì nó có thể hoạt động trong trường hợp của bạn và nếu ai đó muốn để sửa chữa nó. Ngoài ra, ai đó nên gửi yêu cầu tính năng chính thức tới https://ormszilla.samba.org/enter_orms.cgi?product=rsync

Tôi đã viết kịch bản này:

#! /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
  • Hãy thử dán đoạn script vào một tệp có tên rsync-confirm.bash

  • Sau đó chmod +x rsync-confirm.bash

  • Sau đó ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

Kịch bản này có thể là một lỗi nhỏ, tôi nhận thấy rằng nó không thực sự thích nó nếu bạn không có dấu gạch chéo trên thư mục nguồn ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.