ハードリンクがあるcpの動作に驚きました。

ハードリンクがあるcpの動作に驚きました。

私はハードリンクの概念について非常によく知っており、cp基本ツールのマニュアルページだけでなく、最近のPOSIX仕様まで何度も読みました。しかし、私は次のような行動を見つけ、まだ驚きました。

$ echo john > john
$ cp -l john paul
$ echo george > george

この時点では、同じinode(および内容)を持ち、john2つの点で異なります。今、私たちは次のことを行います。paulgeorge

$ cp george paul

この時点で私はinode番号は異なりますが、内容は同じであるとgeorge予想しましたpaul。これらの期待は満たされた。返品paulこれで、別のinode番号があり、johnまだjohnコンテンツがあると予想されますjohn。私はこれが私を驚かせた。ファイルをターゲットパスにコピーすると、共有paulinodepaulの他のすべてのターゲットパスに同じファイル(同じinode)がインストールされることがわかりました。私はこれがcp新しいファイルを作成し、古いファイルが以前に占有されていた場所に移動すると思いましたpaul。代わりに、既存のファイルを開いて切り取り、paul既存のgeorgeファイルに内容を書き込むようです。したがって、同じinodeを持つ「他の」ファイルは、「それらの」内容を同時に更新します。

まあ、これはシステムの振る舞いであり、これが起こることを知っているので、問題を解決する方法を見つけたり、適切な場合にそれを利用することができます。混乱しているのは、この動作が文書化されている場所をどこで見ることができるかということです。文書化されていないと驚きますどこかに私が見た文書には。しかし、明らかに私はそれを見逃しており、今はこの動作を議論するソースを見つけることができません。

ベストアンサー1

cpこのマニュアルには、ターゲットファイルがすでに存在する場合はそのファイルを上書きすることが記載されています。そうですね。 「オーバーライド」が何を意味するのかを指定しませんが、「交換」ではなく「上書き」とはっきりしています。賢明に言えば、「再定義」がcpまさにその仕事をし、希望する動作を「代替」と呼ぶのが適切だと言えます。

さらに、cp既存のオブジェクトファイルを「置き換える」場合、これは「上書き」よりも深刻、驚くべき、または間違っていると見なすことができます。たとえば、

  • 以前のファイルを最初に削除してから新しいファイルを作成すると、ファイルが存在しない期間があることはcp驚くべきことです。
  • 一時ファイルが最初に作成されてから所定の場所に移動された場合は、奇妙cpな名前の一時ファイルが時々見つかるため、これを記録する必要がありますが、そうではありません。
  • 権限の問題により、古いファイルと同じディレクトリに新しいファイルを作成できない場合は、cp残念です(特に古いファイルを削除した場合)。
  • ファイルが実行中のユーザーに属せず、実行中のユーザーにも属していない場合、cp新しいcpファイルrootの所有者と権限を新しいファイルの所有者と権限と一致させることはできません。
  • ファイルにcp未知の特殊属性がある場合、これらの属性はコピーから失われます。最近では、 の実装がcp拡張属性などの項目を安定的に理解できるはずですが、必ずしもそうではありません。 MacOSリソースフォークやリモートファイルシステムなどの他のものも基本的にあります。

cp要約すると、これで実際に何をしているのかがわかりました。もう一度これには驚かないでしょう!正直言って、何年も前に同じことが私に起こったかもしれないと思います。

おすすめ記事