ハードリンクされたファイルのリンクを解除する最善の方法は何ですか?

ハードリンクされたファイルのリンクを解除する最善の方法は何ですか?

を使用するとrdfind、ハードリンクされたファイルが多数(約 60 ~ 90)見つかったので、それらすべてをリンク解除したいと思います。 考えられる解決策の 1 つは、すべてのファイルを見つけて-link +1 コピーし、削除してリンク名に戻すことです。

もっと良い解決策はありますか? もっと簡単な方法はありますか?

答え1

できるよ:

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cat > "$1"; } < "$1"' sh {} \;

ただし、ファイルのメタデータは保持されません。 Linux では、代わりに次の操作を実行できます。

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cp -p /proc/self/fd/0 "$1"; } < "$1"' sh {} \;

catまたは が失敗した場合(ディスクがいっぱいの場合など)、 / がコピーできなかったcpファイルの内容は失われることに注意してください。catcp

-exec {} \;の代わりに を使用する-exec {} +と、ファイルが見つかった後にファイルのリンク数が更新されfind探すリンク数が 1 に減った場合は最後のリンク (つまり、初期リンク数が 4 のファイルの場合、3 つのインスタンスのみが上書きされます)。

GNU を使用するとtar、次のこともできます。

find . -type f -links +1 -print0 |
  tar --hard-dereference --null -T - -cf - | tar xpf -

これにより、実行されるコマンドは少なくなりますが、上書きされるファイルは多くなります。

次のようなものが表示される場合があります:

tar: ./file: file changed as we read it

大きなファイルの場合は問題ありませんが、2 番目の tar はtarファイルを上書きする前にリンクを解除するので、実際には最初のアプローチと非常によく似ています。最初のアプローチtarでは、2 番目の tar がファイルをリンク解除すると、リンク数が減少する (結果として ctime が変化する) ことに気付くだけです。

関連情報