--relativeを追加した後に--link-destがハードリンクの作成を停止するのはなぜですか?

--relativeを追加した後に--link-destがハードリンクの作成を停止するのはなぜですか?

最初の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/foorsyncが愚かな場合にのみハードリンクすることです。ルートの場合、与えられたディレクトリの(この例/tmp/dataでは/tmp/bak

関連情報