web-dev-qa-db-ja.com

GUIモードのMacOSXではハードリンクが機能しない

ハードリンクを使用しているときに、少し奇妙な動作に直面しました。ターミナルから、テキストファイル1.txtと「このファイルへの」ハードリンクを作成します

nano 1.txt
mkdir dir
ln 1.txt ./dir/

結果のハードリンクを確認すると、その内容が元のファイルと同じであることがわかります。

less ./dir/1.txt

初期ファイルを変更します...

nano 1.txt

...そして、その変更がハードリンクに反映されているのを見てください

less ./dir/1.txt

ハードリンクの内容を変更します(もちろん、より正確です-ファイル、ハードリンクで参照されています)...

nano ./dir/1.txt

...そして、変更が初期ファイルに反映されていることを確認してください

less 1.txt

今まで、すべてうまくいっています...

ここで、ターミナルを閉じて、Finderから作成したファイル(1.txtおよび./dir/1.txt)の再生を開始します。この2つのファイルをテキストエディットで変更しても、変更は別のファイルに反映されません。

ハードリンクが壊れています。どうしたの?

5
AntonAL

これはGUIに関するものではなく、特にTextEditの変更を保存するための戦略に関するものです。既存のファイルに適切に書き込むのではなく、最初に新しいファイルを書き込み、それが完了すると古いファイルを削除して新しい名前を古い名前に変更します。 GUIであろうとなかろうと、多くのエディター(概念的にファイルを「インプレース」で変更するプログラム)は、安全のためにこの戦略を使用します(書き込みの直後に非常に不幸な瞬間にクラッシュが発生しても、新しいバージョンと古いバージョンの両方が失われることはありません)が行われています)、しかしあなたが気づいたようにそれはハードリンクを「壊します」。

この動作をする非対話型、非GUIエディタープログラムの一例は、Perl-i( "インプレース編集")コマンドラインオプションスイッチ...:

$ touch za.txt
$ ln za.txt zo.txt
$ echo ciao >za.txt
$ cat zo.txt 
ciao
$ Perl -i -p -e 's/a/b/' zo.txt
$ cat zo.txt
cibo
$ cat za.txt
ciao
14
Alex Martelli