web-dev-qa-db-ja.com

ファイルをハードリンクにコピーする

私は最近、私のbashスクリプトの誤動作に少し気づき、疑問に思っていました。

  1. これは予想されるシステムの動作ですか、それともバグですか
  2. 理想的な回避策は何ですか

本質的に、問題はこれに要約されます。最初に、次のレイアウトの既存のディレクトリ構造がありました。

  • /opt/dir/file.a
  • /opt/dir/file.b
  • /opt/dir/file

ここで、fileハードリンクからfile.aへです。 fileを、パラメーターに応じてfile.aまたはfile.bを選択するシェルスクリプトに置き換えたかったので、次のように実行しました。

cp my_file /opt/dir/file

問題は、filefile.aへのハードリンクであるため(つまり、2つのファイルは実際には同じiノードの2つの名前にすぎない)、変更がfilefile.aの両方に反映されていることです。これは明らかに私が望んでいたものではありませんでした。

cpコマンドは、fopen("file", "w+")のような切り捨てファイルフラグを使用して/opt/dir/fileを効果的に開いたようです。それに書いた。 newファイルをその名前にコピーしていたので、ハードリンクが壊れることを期待していました。

これはcpの正しく予想される動作ですか?それは私には直感的ではないようです。ある場所から別の場所にファイルをコピーするとき、私はそれを書き直すのではなく、置き換えることを心に留めています。これを回避するためのcpのフラグはありますか?私の現在の回避策は、私がrm /opt/dir/file && cp my_file /opt/dir/fileすることです。

マニュアルページを見ると表示cp --remove-destination my_file /opt/dir/fileが正しい解決策かもしれませんが、それでも私は誰もがこの件について何を言わなければならないかに興味があります。

3
Evan Teran

あなたが説明しているのは、バグではなく、cpの正しい動作です。探している結果を考えると、スクリプトに加えた変更(rmの後にcpが続く)は正しいアプローチのように思えます。

2
Mox