実際にファイルを変更する前に、rsyncに確認を待機させます


11

ローカルフォルダーとリモートフォルダーを同期しています。ばかげたコマンドで1つのファイルを失ってしまった。

私は、実際のファイル転送を実行する前に、ユニゾンと確認方法( "go?")に慣れています。

rsyncにそのようなオプションはありますか?(サーバー側でユニゾンなし)

ありがとう!

回答:


3

公式の「--confirm」オプションの代わりに、rsync独自の「バッチモード」を利用して、2つのパスの差を2回計算する必要を回避できます。バッチモードは、ミラーへの変更を配布することを目的としています(一度計算して、多数の同一ツリーを更新します)。2つのファイルが作成されます。更新を含むバッチファイルと、更新を実行するための簡単なスクリプトです(詳細はrsyncのmanページの最後にあるセクションにあります)。

プロセスを抽象化するための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

7

rsyncで-nオプションを使用して、予行演習を実行できます。rsyncは、実際に実行せずに実行した操作を通知します。結果に満足したら、-nオプションなしで再実行します。


7

--backupオプションを使用して、上書き時に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の実行後、backup-dirでファイルをスキャンし、復元する必要があるかどうかを1つずつ確認できます。


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/

このスクリプトは少しバグがあるかもしれませんが、ソースディレクトリの末尾にスラッシュがないと、スクリプトが気に入らないことに気づきました...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.