元のファイルを失うことなくUbuntuからハードリンクを削除する方法は?

元のファイルを失うことなくUbuntuからハードリンクを削除する方法は?

私はUbuntuを使用していますdropbox。問題は、私の写真フォルダに多くのハードリンクがあり、同期の問題があることです。

写真を失うことなく簡単なコマンドでどのようにすべて削除できますか?単一ファイルに対して次のコマンドが見つかりました。

find /home -xdev -samefile "filename" | xargs rm

しかし、すべてのファイルに対してこれを行う方法がわかりません。

事前にありがとう

私のファイルシステムに関する情報:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

答え1

ファイルに複数のハードリンクがある場合は、そのファイルを削除でき、最後のハードリンクが削除されるとデータは削除されます。リンク数は(*)を使用して検索できるため、stat -c '%h' {file}次のように複数のハードリンクを持つすべてのファイルを削除できます。

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

彼らが言ったように、結局は一つだけ残ります。、ディレクトリの処理順序、アルファベット順などに基づいて、生存者が最後に確認されます。

(*)これはの出力にも表示されますが、ls -l解析するのは難しいです...

答え2

あなたは削除することができます「追加の」すべての文書のコピーは次のとおりです。

find /home -xdev -type f -links +1 -delete

ただし、これらの追加のコピーの一部は外部の場所にハードリンクされている可能性があることに注意してください。/home(そして迷子になったように見えるかもしれません)。

これ-links +1複数のハードリンクfind()を持つファイルのみが選択されていることを示します。-type f

(より多くのタスクを介して)find各ファイルのinode値を印刷し、結果を並べ替えて(使用awk)を介して削除するファイルのリストを作成できますが、xargsそうすると、特殊文字(スペースを含む)を持つファイルに会います。名前。しかし、これはファイルが外部にリンクされているときに驚きを取り除く方法です。/home

答え3

Unix / Linux / MacOSでは、ディレクトリのファイル名はディスクの構造であるinode(間接ノード)を表します。本物ファイルです。これらの名前とインデックスノードの関連付けを呼び出します。ハードリンクそしてソフトリンクこれは本質的にファイルを見つけることができる名前を含むファイルです。リンクしようとしているファイルへのパスの一部を削除または名前を変更すると、ソフトリンクが壊れる可能性がありますが、1つのハードリンクの名前を変更または移動しても他のリンクにはまったく影響しません。

したがって、「オリジナルファイル」は存在せず、みんなハードリンクはまったく同じ状態を持ちます。 inodeはファイルを参照するハードリンクの数を記録します(ls -lこの番号を2番目のフィールドとして表示します。ファイルの場合は通常1(単一のリンク)、ディレクトリの場合は通常2(親リンクと「.」)リンク)ディレクトリ自体です。; ; サブディレクトリがある場合、各サブディレクトリは親ディレクトリを参照するため、数が増加します。

関連情報