rsyncで名前が変更されたファイルまたはディレクトリの処理


26

rsyncディレクトリ複製用のスクリプトを作成しています。新規または変更されたファイルまたはディレクトリのみを同期していますが、名前の変更されたファイルまたはディレクトリを新しいファイルまたはディレクトリとしてコピーし、ファイルを同期しないという事実は好みません。また、これは業務時間中に実行されるため、1MBの帯域幅制限を設定しました。これが私のスクリプトです。

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

誰かが何かの名前を変更しても、新しいまたは変更されたファイルをコピーするだけで、ファイルとディレクトリの同期を維持するにはどうすればよいですか ここに問題のファイルがあります

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

または、名前を変更したファイルを別のディレクトリに移動する方法もあります /mymounts/VerControlか?

回答:


23

rsyncソースディレクトリとターゲットディレクトリのファイルシステムがハードリンクをサポートしている場合は、移動したファイルや名前を変更したファイルを処理できます。その考えは、rsyncに実際の転送の前にハードリンクを再構築させることです。ここで素晴らしい説明を見つけることができます。

ソース/ターゲットディレクトリ内にハードリンクの非表示ツリーを作成する簡単なソリューションになりました。基本的なスクリプトは次のようになります。

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

私が持っているGitHubの上のスクリプトの例を。しかし、本番環境でこの方法を使用する前に、大量のテストを行うことをお勧めします。


また、リンクする「すばらしい説明」は、この素晴らしい基本的なrsync記事であるFWIWを指します。everythinglinux.org/rsync
JakeGould

19

-y | --fuzzyrsyncオプションをご覧ください。それ以外は、rsyncには名前の変更を追跡する方法がないため、名前の変更されたファイルを転送することになります。

rsyncマンページから:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.

7
を使用する場合は、「デフォルトでrsyncがa を実行するため、ベースファイルを削除してからコピー/移動できるようにする--fuzzyように--delete-delay、結合することを検討してください。出典:ソニアハミルトン--delete-before
ローナンジュシェ

1

できません。

Rsyncには3つのモードがあります。

  • すべてのファイルをコピー
  • 既存の(変更された/変更されていない)ファイルのコピー-これには多くのオプションがあります
  • 存在しないファイルをコピーします。

ただし、これら3つのモードには2つのサブカテゴリがあり、

  • 除外する
  • に含める

Rsyncは、名前が変更されたファイルを追跡せず、状態を持ちません。コピーの代わりに考えてみましょうすべてのファイルを、あなたがものを除くませんしたいが。シフティングホワイトリストを作成することはできません。ブラックリストを作成することはできます。

rsync [..stuff..] --exclude 'lib/'

名前を変更したファイルを入力する必要があります。
jmituzas

存在しないファイルを削除することもできますが、それはまったく問題ありません。ただし、コピーの機能として、ソースで名前を変更すると、名前が変更されたファイルがコピーされます。
エヴァンキャロル

-bを使用してバージョンを保持し、suffix =を設定してdate +%Y%m%d%k%M%Sも、suffix = date +%Y%m%d%k%M%S.ORIGINALSUFFIXを取得できますか?
jmituzas

0

私の知る限りrsync、ファイルの名前変更を認識できません。新しいファイルを再度転送する必要があります。artyomの答えをご覧ください。

なくなったファイルを削除するには、必ず--deleteオプションを使用してください。

また、ミラーリングのために、いくつかの素晴らしいオプションをエイリアスする-aarchive)を使用することをお勧めします。

見ていman 1 rsync詳細を。


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