最初のrsyncコマンドが完全に機能し、/tmp/dataのレプリカを/tmp/bakに生成する理由ハードリンクの使用しかし、2番目はレプリカを作成します。バイトコピーハードリンクの代わりに?
rsync -a --link-dest=/tmp/data /tmp/data/ /tmp/bak/ # HARDLINKS
rsync -a -R --link-dest=/tmp/data /tmp/data/ /tmp/bak/ # REGULAR COPIES
テスト/再生ステップ
cd /tmp/
rm -rf data bak
mkdir data bak
echo foo > data/foo
stat /tmp/data/foo | grep Inode
rsync -a --link-dest=/tmp/data /tmp/data/ /tmp/bak/
stat /tmp/bak/foo | grep Inode
### Note that the inode is the same as above.
rm bak/*
rsync -a -R --link-dest=/tmp/data /tmp/data/ /tmp/bak/
stat /tmp/bak/tmp/data/foo | grep Inode
### Note that the inode is different.
答え1
-R
()フラグを使用すると、--relative
すべてのパスを含むすべてのパスにソースパスが接頭辞で付けられます--link-dest
。
あなたの例でこの問題を解決するには
rsync -a -R --link-dest=/tmp/data /tmp/data/ /tmp/bak/
これはリンク先のパスになることを意味します/tmp/data/tmp/data
。 (cp -al /tmp/data /tmp/link
およびを使用すると、これをより明確に表示できますstrace -f rsync ... --link-dest=/tmp/link
。)
この場合の解決策は、--link-dest=/
生成された開始点が必要なものになるように使用することです。--link-dest=/tmp/data
rsync -a -R --link-dest=/ /tmp/data/ /tmp/bak/
stat /tmp/bak/tmp/data/foo | grep Inode # Same inode as source, with Links: 2
答え2
これは興味深い質問です。
これを使用すると、ターゲットディレクトリにrsync -R
コピーされます。tmp/data
問題は、rsyncがコピーするときに、まず下のディレクトリにファイルがあることを確認することです--link-dest
。
つまり、/tmp/bak/*
と比較されます/tmp/data/*
。
問題は、rsync -R
コマンドを実行すると、ファイルがリンク用にfoo
/ tmp / data /と比較できる場所になく、/tmp/bak/tmp/data/foo
rsyncが愚かな場合にのみハードリンクすることです。ルートの場合、与えられたディレクトリの(この例/tmp/data
では/tmp/bak
)