Files

如何刪除文件的所有重複硬連結?

  • May 28, 2020

我有一個由創建的目錄樹rsnapshot,它包含相同目錄結構的多個快照,所有相同的文件都被硬連結替換。

我想刪除所有那些重複的硬連結並只保留每個文件的一個副本(這樣我以後可以將所有文件移動到一個排序的存檔中,而不必兩次觸摸相同的文件)。

有沒有這樣的工具?

到目前為止,我只找到了查找重複項並創建硬連結來替換它們的工具……

我想我可以列出所有文件及其 inode 編號並自己實現重複數據刪除和刪除,但我不想在這裡重新發明輪子。

最後,根據Stéphanexenoid 的提示以及一些先前使用find.

我不得不修改一些命令來使用 FreeBSD 的非 GNU 工具——GNUfind-printf可以替代 . 的選項-exec stat,但 FreeBSDfind沒有。

# 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

引用自:https://unix.stackexchange.com/questions/286686