ファイル/ディレクトリ自体を削除せずにrmハードリンク

ファイル/ディレクトリ自体を削除せずにrmハードリンク

ハードリンクを作成するとしますln x y

リンクを作成した後、xからファイルを削除せずにyからリンクを削除する方法はありますか? yに対して操作を行いましたが、xも削除したようですrm -rf。可能であれば、これを避けたいと思います。ハハ。

答え1

$ echo 'hello' >name
$ ln name othername
$ ls -l
total 4
-rw-r--r--  2 kk  wheel  6 Jun 25 09:45 name
-rw-r--r--  2 kk  wheel  6 Jun 25 09:45 othername
$ cat othername
hello
$ rm name
$ ls -l
total 2
-rw-r--r--  1 kk  wheel  6 Jun 25 09:45 othername
$ cat othername
hello

1つのハードリンクを削除しながら他のハードリンクも削除する場合は、深刻な間違いを犯すことです。この場合、rmまたはを使用することは重要ではなく、rm -rfどの名前が削除されるかは重要ではありません。

ハードリンクを削除すると、ファイル名の1つだけが削除されます。私の考えでは、rm -rfこれら2つの名前を削除する唯一の方法は、これら2つの名前と一致するファイル名globと一緒に使用するか、両方の名前を含むディレクトリを削除することです。


コメントを見ると、実際に次の項目へのハードリンクを生成するアプリケーションを使用しているようです。目次。特定の条件では、macOS HFS +ファイルシステムでこれが可能です。一般的に本物ハードリンクディレクトリを扱うのは面倒で、その使用は主にAppleのTimeMachineソフトウェアのようなものに制限されています。

関連Stackoverflow質問:OS Xでディレクトリハードリンクを生成するUnixコマンドは何ですか?

unlinkその質問に対する回答で述べたように、ハードリンクされたディレクトリを削除するrm -r代わりに使用する必要があります。rm -rコンテンツ(すべての名前で)。

また見なさい:ディレクトリハードリンクを強制的に作成しますか?

答え2

私はこれが古い投稿であることを知っていますが、ハードリンクはファイルでのみ機能しますが、ハードリンクオプションと一緒にコピーを使用して再帰的なコピーを作成できますが、Mac OSでも動作しますが、Macでは警告が表示されますが、メッセージは無視できます.

cp -Ral x y

再帰を表し-R-a属性を表し、-lリンクを表します。

その後は、またはをrm -rf x実行でき、rm -rf y他のものはそのまま残ります。

答え3

リンクは、同じファイルを指す新しいファイル名です。ハードリンクを作成することは、ソースファイルのinodeを指す新しいディレクトリエントリ(ファイル名)を作成することです。これがファイルシステム間でハードリンクを作成できず、両方のリンクのメタデータ(権限、xattrsなど)が同じ理由です。 Linuxでは、ディレクトリ以外のファイルに対してのみハードリンクを作成できます。

ディレクトリエントリの数は、inodeのリンク数で追跡されます。ハードリンクが作成されると、リンク数が増加します。ファイルが削除されると、ディレクトリエントリが削除され、リンク数が減ります。ls -l出力の2番目の列でリンク数を確認できます。単一のディレクトリエントリ(リンク)を削除しても、他のディレクトリエントリは削除されません。

ターゲットファイルを含む同じディレクトリに新しいハードリンクを作成すると、両方のリンクがrm -rf *削除されます(リンク数が0になると、ファイルが使用するスペースがファイルシステムから回収されます)。

関連情報