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