次の設定があるとしましょう。
$ 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
オーバーレイモードで次のことをしたいと思います。
fileB
ハードドライブのどこかをコピーしてください。fileA
ハードドライブアドレスリンク
しかし、その代わりに、私はそれが次のようなことをすると推論します。
- リンクをたどる
fileA
fileB
この住所の内容をコピーしてください。
うまくいかないようですmv
。期待どおりに動作します。
私の質問:
- 私が逃した場所は説明されていますか
man cp
?man mv
man ln
- この行動はただ偶然ですか?(ifのサイズが
fileB
大きくないと仮定fileA
)、または関数として安定して使用できますか? - これがハードリンクの概念を崩すのではないか?
- 次の行が引き続き表示さ
cp fileB fileA
れるように、その行を変更する方法はありますか?cat myLink
textA
答え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のコピーを書き込むと推論します。
あなたは何を誤解協会はい。 cp
myLinkへのリンクのように「fileAへのリンクに従わない」両方のディレクトリエントリは同じ inode にリンクされます。rm
ファイルにアクセスするときにデフォルトのシステムコールに名前が付けられることを検討してください。unlink
。