Files
如何刪除文件的所有重複硬連結?
我有一個由創建的目錄樹
rsnapshot
,它包含相同目錄結構的多個快照,所有相同的文件都被硬連結替換。我想刪除所有那些重複的硬連結並只保留每個文件的一個副本(這樣我以後可以將所有文件移動到一個排序的存檔中,而不必兩次觸摸相同的文件)。
有沒有這樣的工具?
到目前為止,我只找到了查找重複項並創建硬連結來替換它們的工具……
我想我可以列出所有文件及其 inode 編號並自己實現重複數據刪除和刪除,但我不想在這裡重新發明輪子。
最後,根據Stéphane和xenoid 的提示以及一些先前使用
find
.我不得不修改一些命令來使用 FreeBSD 的非 GNU 工具——GNU
find
有-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