これを使って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
ファイルの内容が失われたりコピーできなくなります。cat
cp
-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が変更されます)。