元のファイルを失うことなく Ubuntu 上のハードリンクを削除するにはどうすればいいですか?

元のファイルを失うことなく Ubuntu 上のハードリンクを削除するにはどうすればいいですか?

私は Ubuntu を使っていますdropbox。問題は、画像フォルダにハードリンクが多数あるため、同期に問題があることです。

画像を失わずに、簡単なコマンドですべて削除するにはどうすればいいでしょうか? 1つのファイルに対して、次のようなコマンドを見つけました。

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(間接ノード)を参照します。本当にファイルです。この名前とinodeの関連付けは、ハードリンクとは対照的にソフトリンクこれは本質的に、ファイルを見つけることができる名前を含むファイルです。リンク先のファイルへのパスの一部が名前変更または削除されると、ソフト リンクが壊れる可能性がありますが、1 つのハード リンクの名前を変更または移動しても、他のリンクにはまったく影響しません。

したがって、「元のファイル」は存在しません。全てハード リンクもまったく同じステータスです。inode は、ファイルを参照するハード リンクの数を記録します (ls -lこの数は 2 番目のフィールドに表示されます。通常、ファイルの場合は 1 (リンクは 1 つだけ)、ディレクトリの場合は 2 (親のリンクとディレクトリ自体の '.') です。サブディレクトリがある場合は、それぞれが '..' を介して親を参照するため、カウントが増加します)。リンク カウントが 0 になると、ファイルによって使用されるスペースが再利用されます。

関連情報