ローカルフォルダとリモートフォルダを同期しています。たまたま愚かなコマンドで1つのファイルを失いました。
私は、実際のファイル転送を行う前に、統一して確認する方法(「go?」)に慣れています。
Rsyncにそのようなオプションはありますか? (サーバー側でユニゾンなし)
ありがとう!
公式の「--confirm」オプションの代わりに、rsync独自の「バッチモード」を利用して、2つのパス間の差を2回計算する必要を回避できます。バッチモードは、変更をミラーに配布することを目的としていました(一度計算すると、多くの同一のツリーが更新されます)。 2つのファイルが作成されます。更新を含むバッチファイルと、更新を実行するための簡単な便利なスクリプトです( rsyncのマニュアルページ の終わりに詳細が記載されたセクションがあります)。
プロセスを抽象化するための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よりも大きい)を移動する場合は、スペースの制約に遭遇する可能性があることに注意してください。
Rsyncで-nオプションを使用して、ドライランを実行できます。 rsyncは、実際に実行せずに実行したであろう操作を教えてくれます。結果に満足している場合は、-nオプションを指定せずに再実行してください。
--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つずつ確認できます。
残念ながら、執筆時点では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/
このスクリプトは少しバグがあるかもしれませんが、ソースディレクトリの末尾にスラッシュがない場合は、実際には気に入らないことに気づきました...