No final, não foi muito difícil fazer isso manualmente, com base em Stéphane e dicas do xenoid e alguma experiência anterior com find
.
Eu tive que adaptar alguns comandos para trabalhar com ferramentas não-GNU do FreeBSD - GNU find
tem a opção -printf
que poderia ter substituído o -exec stat
, mas o find
do FreeBSD não tem isso.
# 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