rsync は宛先にフォルダを作成せずにファイルのみを同期します

rsync は宛先にフォルダを作成せずにファイルのみを同期します

rsync を使用して宛先にディレクトリを作成しないようにすることは可能ですか?

私がその情報源を持っていると想像してください:

a/
a/x.txt
b/
b/y.txt

そして私の目的地は次の通りです。

a/
a/z.txt

望ましい結果rsync source destination:

a/
a/x.txt
a/z.txt

もちろん、私の実際の状況には数千のファイル/フォルダー構造が含まれており、同期されたフォルダーの明示的なリストを含むソリューションは望んでいませんが、それは可能です。宛先にフォルダーが作成されないようにするためのクリーンな方法を探しています。除外またはフィルタリングによって... rsync がこれを実行できない場合は、権限のハックなど、rsync の外部で何かが発生する可能性もあります...


ちなみに、このような状況に陥るのは本当に簡単です。私の場合は次のとおりです。

  • A2 つのディスク( &とします) を持つサーバーと、Bローカル ドライブがあるとしますC
  • 私は通常、rsyncリモートA& をBローカルに同期(およびマージ)するために使用しますC
  • Cその後、いくつかのファイルを と にA同期し直したい場合がありますB。(新しいファイルのみ... 宛先に存在しないフォルダーではありません)

答え1

次のことを試してください。

rsync -av src:/dir/to/files/* /dest/dir

複数のネストされたサブディレクトリがある場合は、最初に次のような操作を行う必要があります。

find /dir/to/files -type d -print

そのディレクトリのリストをループで実行し、そのたびに rsync を呼び出します。もちろん、これをリモート マシンで実行している場合は、ssh 経由で find を発行し、結果を配列に保存してから rsync ループを実行する必要があります。

答え2

私はこれを rsync に実装し、アップストリームにパッチを送信しました。 https://lists.samba.org/archive/rsync/2015-November/030455.html

答え3

通常の rsync を実行してから、2 番目のステップで新しく作成されたすべてのフォルダーを削除するとよいかもしれません... 危険そうです。

この操作の安全性を高めるために、宛先システムのユーザーとは別のユーザーを使用できます。

rsync $src $specialuser@server:$destination

そのユーザーによってリモートで作成されたフォルダーを削除します。

ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"

次に、権限を通常の状態に戻します。

ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"

くそ、これは汚いね...これはかなり改善が必要だね :D

答え4

/*結果の各行に を追加するスクリプトを使用して、ターゲット上に include_file ファイルを作成することをお勧めします。

[target_dir] -type d >[target_dir]/include.file を検索します。

次に、rsync を使用して、--include_file=[target_dir]/include.fileそのファイル内のパターンに一致するファイルのみを含めるように指定できます。これは、指定したポイントの下にあるターゲット上のフォルダーの完全なリストになります。

これを毎回実行するスクリプトを作成すれば、include.file のリストは常に最新のものになります。それ以外の場合は、ときどき (rsync で戻したい各サーバーで 1 つずつ) 更新するだけでもかまいません。

後で時間ができたら、ここで使える Python スクリプトを投稿しますが、これは前進するための良い道筋となるはずです。

関連情報