シンボリックリンクにおけるcp -aの予期しない動作

シンボリックリンクにおけるcp -aの予期しない動作

増分バックアップからシンボリックリンクをコピーすると、予期しない動作が発生する可能性があります。たとえば、

# mkdir 0 1 2
# touch 0/a
# ln 0/a 0/b
# touch 1/a
# ln 1/b 1/a

だからディレクトリは0次のようになります

a
b->a

ディレクトリは1次のとおりです

a->b
b

今私たちは走る

# cp -a 0/. 2
# cp -a 1/. 2

予想/予想される動作は、ディレクトリが2同じ1ですが、実際には2つのリンクが含まれているということです

a -> b
b -> a

これは、実際には/ usr /ディレクトリの一部のrsyncバックアップをコピーしたときに発生しました。昨年、/usr/share/zoneinfo ディレクトリにはさまざまなシンボリックリンクスイッチがありました。cp -aSOURCEではシンボリックリンクに従わないが、DESTではシンボリックリンクに従うことができるようです。

ここで適切な結果を得る方法はありますか?

(ところで、rsync正しく完了しましたが、フラグも使用したかったのですが--reflink=always…)cp

答え1

これは最初に実行されますが、cp -a 1/. 2すでに存在するので内容が記録されます。次に、シンボリックリンクを上書きすることを検討してください。再実行すると。bb -> abaa->baa->bcp -a 1/. 2"Too many levels of symbolic links"

はい、cpターゲットのシンボリックリンクに従ってください。--remove-destinationMWEの問題を解決してみてください。ただし、シンボリックリンクをターゲットのディレクトリコンポーネントとして含めることは含まれません--remove-destination

本当の質問は「なぜこんなことをしますか?」です。私はcp -a空のディレクトリをターゲットとして使用します。さらに、サポートされているファイルシステムには、--reflink=alwaysディレクトリツリーをバックアップに複製するよりエレガントな方法があります。

関連情報