ファイルへの重複したハードリンクをすべて削除する方法は?

ファイルへの重複したハードリンクをすべて削除する方法は?

rsnapshot同じディレクトリ構造の複数のスナップショットを含み、同じファイルがすべてハードリンクに置き換えられたディレクトリツリーが作成されました。

これらのハードリンクの重複エントリをすべて削除し、各ファイルのコピーを1つだけ保持したいと思います。これにより、後で同じファイルに2回触れることなく、すべてのファイルをソートされたアーカイブに移動できます。

これを行うためのツールはありますか?
これまで、重複項目を見つけることができるツールだけが見つかりました。作るこれに代わるハードリンク...
すべてのファイルとそのinode番号をリストし、重複排除と削除を直接実装できると思いますが、ここではホイールを再発明したくありません。

ベストアンサー1

最後に、これを手動で行うことはそれほど難しくありません。スティーブンそしてジェノイドのようなヒントといくつかの事前経験find
FreeBSDのGNU以外のツールと連携するには、いくつかのコマンドを調整する必要がありました。 GNUにはそれを置き換えるオプションがfindありますが、FreeBSDはそうではありません。-printf-exec statfind

# create a list of "<inode number> <tab> <full file path>"
find rsnapshots -type f -links +1 -exec stat -f '%i%t%R' {} + > inodes.txt

# sort the list by inode number (to have consecutive blocks of duplicate files)
sort -n inodes.txt > inodes.sorted.txt

# remove the first file from each block (we want to keep one link per inode)
awk -F'\t' 'BEGIN {lastinode = 0} {inode = 0+$1; if (inode == lastinode) {print $2}; lastinode = inode}' inodes.sorted.txt > inodes.to-delete.txt

# delete duplicates (watch out for special characters in the filename, and possibly adjust the read command and double quotes accordingly)
cat inodes.to-delete.txt | while read line; do rm -f "$line"; done

おすすめ記事