rsync の --link-dest オプションがファイル時間のために接続されていません。

rsync の --link-dest オプションがファイル時間のために接続されていません。

次のテストケースを考えてみましょう。

mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test

rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

予想通り、rsyncはc/testハードリンクを生成しますb/test(参照数を参照2)。

# ls -l c/test
-rw-r--r-- 2 root root 16 Jan  6 19:43 test

今これを見てください:

rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

ハードリンクが生成されませんでした。

# ls -l c/test
-rw-r--r-- 1 root root 16 Jan  6 19:50 test

これマンページ言った(強調):

すべてのファイルは同じでなければなりません予約するファイルをリンクするための属性(権限、所有権など)

しかし、基本的にファイル時間はそうではないと思います。予約するしたがって、ここに違いはありません。

何が問題なの?これはバグですか?どうですか?

私の目標は、同じファイルをすべてハードリンクして、ストレージの複数のブランチをホストする連続統合サーバーのスペースを節約することです。だから私の実際のコマンドは次のようになります
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123
つまり、時間に拘束されないという意味なので、touch以前は現在の時間にすべてを追加することを検討していましたが、rsyncこれはやや粗雑な解決策になり、タッチが再帰的に機能しないようです。

答え1

サイズとタイムスタンプに基づいてファイル転送を決定するrsyncの「クイックチェック」アルゴリズムの結果が表示されます。詳細は次のとおりですman rsync

Rsyncは、サイズまたは最後の変更時間が変更されたファイルを検索する「クイックチェック」アルゴリズム(デフォルト)を使用して、転送する必要があるファイルを見つけます。クイックスキャン結果ファイルのデータを更新する必要がないことが表示された場合は、他の保持された属性(オプションで要求されているように)に対するすべての変更がターゲットファイルに直接適用されます。

次のオプションがあります。

  • タイムスタンプを無視して変更されたサイズのみに基づいてファイルを転送する場合は、この--size-onlyオプションを使用できます。

    これはrsync、ファイルサイズを同じに変更すると、変更されたファイルが転送されないことを意味します。

  • rsyncファイルの内容が実際に同じであることを確認するには、を使用します--checksum。これはかなりの速度低下を引き起こす可能性があります。

「クイックチェック」アルゴリズムは通常、速度と精度の間で適切な妥協を提供するため、基本的なアルゴリズムです。

関連情報