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

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

これを使って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

tar大容量ファイルの場合、2番目の方法はファイルを上書きする前にリンクを解除するため、実際には最初の方法と非常によく似ているため、これは重要ではありません。 2番目のtarがファイルのリンクを解除すると、リンク数が減少することが最初にわかりtarます(結果的にctimeが変更されます)。

関連情報