次のテストケースを考えてみましょう。
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
。これはかなりの速度低下を引き起こす可能性があります。
「クイックチェック」アルゴリズムは通常、速度と精度の間で適切な妥協を提供するため、基本的なアルゴリズムです。