cpはターゲットを上書きせずにハードリンクを上書きします。

cpはターゲットを上書きせずにハードリンクを上書きします。

次の設定があるとしましょう。

$ cat fileA
textA
$ cat fileB
textB
$ ln fileA myLink
$ cat myLink # as expected
textA

次の動作がわかりません。

$ cp fileB fileA
$ cat myLink # expected ?
textB

私が書いたのであれば、このような結果を予想していましたが、ln -s fileA myLinkここではそうではありませんでした。

cpオーバーレイモードで次のことをしたいと思います。

  1. fileBハードドライブのどこかをコピーしてください。
  2. fileAハードドライブアドレスリンク

しかし、その代わりに、私はそれが次のようなことをすると推論します。

  1. リンクをたどるfileA
  2. fileBこの住所の内容をコピーしてください。

うまくいかないようですmv。期待どおりに動作します。

私の質問:

  1. 私が逃した場所は説明されていますかman cpman mvman ln
  2. この行動はただ偶然ですか?(ifのサイズがfileB大きくないと仮定fileA、または関数として安定して使用できますか?
  3. これがハードリンクの概念を崩すのではないか?
  4. 次の行が引き続き表示さcp fileB fileAれるように、その行を変更する方法はありますか?cat myLinktextA

答え1

ハードリンクへの「リンクフォロー」はありません。ハードリンクを作成するのは、同じファイルに複数の異なる名前を付けるだけの問題です。 (低レベルでは、ファイルは実際には整数です。 - "inodes"、その名前はユーザーの便宜のためだけです。) - ""オリジナル"と"コピー"はありません - 同じです。したがって、開いて書き込むハードリンクはまったく同じです。そしてすべて同じです。

したがって、cpデフォルトではファイルは開かれ、ファイルに書き込まれ、ファイル(および含まれる名前)が変更されます。はい。これは予想されます。もう一度書き込むのではなく、最初に名前の1つを削除してから(リンク数を減らして)、ユーザー名と同じ名前で新しいファイルを再生成すると、最終的に2つの異なるファイルが作成されます。それがcp --remove-destinationすべきことです。

1基本は次の文書link(2)で文書化されています。ln(1)

2はい、これは通常の動作であり、偶然ではありません。しかし、上のコメントを見てくださいcp --remove-destination

サムいいえ本当に。ハードリンクは、同じファイルの複数の名前にすぎません。あなたが望むのは、特別なファイルシステムにのみ存在するCOW(記録中のコピー)リンクです。

4はい、cp --remove-destination fileB fileA

答え2

はい、これは予想される動作です。 ln fileA myLink作るハードリンクつまり、fileAとmyLinkは同じディスクファイルの2つの名前です。

ls -ilディスプレイ用インデックスノード数値の場合、例の終わりには2つの異なるファイルのみが生成されることがわかります。

参照したマニュアルページに加えて、読みたいことがあります。man 2 link基本的なシステムコールの詳細です。


私はcpが新しく作成されたfileBのコピーへのリンクでfileAへのリンクを上書きするだけでなく、実際にfileAへのリンクをたどってそこにfileBのコピーを書き込むと推論します。

あなたは何を誤解協会はい。 cpmyLinkへのリンクのように「fileAへのリンクに従わない」両方のディレクトリエントリは同じ inode にリンクされます。rmファイルにアクセスするときにデフォルトのシステムコールに名前が付けられることを検討してください。unlink

関連情報