--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

おすすめ記事