Aqui está uma solução que funciona. Eu testei bastante extensivamente. No entanto, saúdo as melhores respostas. Prefiro selecionar a resposta de outra pessoa que a minha (o que diz algo sobre minha confiança nas minhas habilidades de script bash).
find "$dir" -type f -links +1 -exec find "$topdir" -xdev -samefile '{}' -printf '%i:%p\n' \; | sort --field-separator=:
Aqui está a solução completa, estendendo a pergunta vinculada (supondo que funcione):
#!/bin/bash
set -o nounset
topdir='/'
dir='/MotherBoards/Tyan S2720 Thunder i7500/IntelNetworkAdapterDrivers/Setup/'
echo "starting..."
# For each path which has multiple links
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# (except ones containing newline)
last_inode=
while IFS= read -r path_info
do
inode=${path_info%%:*}
path=${path_info##*:}
if [[ $last_inode != $inode ]]; then
printf "$inode\n"
last_inode=$inode
path_to_keep=$path
else
printf "$inode\tln -s\t'$path_to_keep'\t'$path'\n"
rm -- "$path"
ln -s -- "$path_to_keep" "$path"
fi
done < <( find "$dir" -type f -links +1 -exec find "$topdir" -xdev -samefile '{}' -printf '%i:%p\n' \; | sort --field-separator=: )
# Warn about any excluded files
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
buf=$( find "$dir" -type f -links +1 -wholename '*
*' )
if [[ $buf != '' ]]; then
echo 'Some files not processed because their paths contained newline(s):'$'\n'"$buf"
fi
echo "finished"
exit 0