web-dev-qa-db-ja.com

cp -lとlnのハードリンクに違いはありますか?

Rsyncとハードリンクを使用してバックアップスキームを実装しています。 rsyncでlink-destを使用してハードリンクを実行できることはわかっていますが、rsyncに「link-dest」が実装される前に「cp -l」を使用することについて言及しました。私が知っているハードリンクのもう1つの方法は「ln」です。

だから私の質問は、好奇心から: "ln"を使用する場合と比較して "cp -l"を使用してハードリンクを作成する場合に違いはありますか?

15
twan163

元のファイルへのハードリンクが作成されるという点で、両方の結果は同じである必要があります。

違いは、意図された使用法であり、したがって、各コマンドで使用可能なオプションです。たとえば、cpでは再帰を使用できますが、lnでは次のことはできません。

cp -lr <src> <target>

<target>のすべてのファイルへのハードリンクを<src>に作成します。 (リンクではなく、新しいディレクトリが作成されます)結果は、<target>の下のディレクトリツリー構造は、<src>の下のディレクトリツリー構造と同じに見えます。後者を使用すると、各ファイルとフォルダーがコピーされ、それぞれに新しいinodeが付与されるという点でcp -r <src> <target>とは異なりますが、前者はファイルにハードリンクを使用するだけなので、Linksカウントを単純に増やします。

例のように単一のファイルをコピーするために使用すると、結果は同じになります。

17
garethTheRed

linkは最も少ないシステムコールを使用し、次にln、最後にcpが続きます。

$ strace link f.txt g.txt | wc --lines
282

$ strace ln --symbolic f.txt g.txt | wc --lines
311

$ strace ln f.txt g.txt | wc --lines
334

$ strace cp --symbolic f.txt g.txt | wc --lines
394

$ strace cp --link f.txt g.txt | wc --lines
410
3
Steven Penny