rsyncは宛先のファイルを削除しません


22

時間とともに変化するディレクトリを別のディレクトリにミラーリングしようとしています。私の問題は、ソースディレクトリにファイルがもう存在しない場合、rsyncが宛先のファイルを削除しないことです。デモスクリプトは次のとおりです。

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

出力は次のとおりです。

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

ご覧のとおり、rsyncを2回実行した後も、ファイル "a"は宛先ディレクトリに残っていますが、これは必要なものではありません。「--delete」オプションを誤用していますか?


ソースディレクトリの最後にある/ *に注意してください。これにより、rsyncはディレクトリ自体ではなく、それらのファイルのみを考慮します(そして、もはや存在しないファイルがないこと)。
ウォルトストーンバーナー

回答:


9

その理由は、/ tmp / 1 / bでrsyncを呼び出しているためです。これは、/ tmp / 1 / aファイルをまったく考慮しません。

あなたの意図は、ディレクトリ/ tmp / 1 /をrsyncすることのようです-個々のファイルではなくソースとして "/ tmp / 1 /"を使用すると、ディレクトリから "a"が削除され、削除されたことがわかります。ターゲットからそれ。


23

を削除し*ます。rsyncのマニュアルページで述べたように、この--deleteオプションはワイルドカードエントリでは機能しません。

代わりにこれを使用してください:

rsync -a --delete $DIR1/ $DIR2/

"だけで同期されているディレクトリの、これは、受信側からの無関係なファイル(送信側ではないもの)を削除するにrsyncを伝えます--delete。 あなたは、全体のディレクトリを送信するためにrsyncを求めている必要があります(たとえば、dirまたはdir/)ディレクトリの内容(例えば、ワイルドカードを使用せずにdir/*、ワイルドカードはシェルとのrsyncによって展開されているため)ので、個々のファイルを転送するための要求ではなく、ファイルの親ディレクトリを取得します。 ファイル転送から除外されていることもあることから除外されています--delete-excludedオプションを使用するか、ルールを送信側でのみ一致するものとしてマークしない限り、削除されます(フィルター規則セクションのinclude / exclude修飾子を参照)。


これは2011年から、機能スベンの答えと同じです
ローワン・ホーキンス

8

2番目のrsync行をrsync -a --delete $DIR1/ $DIR2(*なしで)変更すると機能します。理由は、シェル*が最初のディレクトリのファイル名に展開するためです。これはbのみであり、実行されるコマンドは実際にはrsyncによって欠落ファイルaはまったく考慮されませんrsync -a --delete $DIR1/b $DIR2

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