Se você precisar usar find … -print0 e não for possível usar -z com sort e / ou tail , existe uma possível solução alternativa, porém incômoda (substitua (N+1) como de costume):
find . -type f -printf "%i\n" | sort | uniq | sort -R | tail -n +(N+1) |
while read i; do
find . -type f -inum "$i" -delete
done
O truque sujo é que usamos números de inode em vez de caminhos.
O find interno remove todos os arquivos com o número de inode fornecido no diretório atual, portanto, se alguns arquivos forem vinculados um ao outro, você perderá todos ou manterá todos eles.
Preliminary sort | uniq é para evitar um contratempo quando você perde muito devido a números de inodes duplicados devido a hardlinks. Você pode acabar com mais de N nomes de arquivos, apontando para até N inodes distintos no total.
Caso o seu find não entenda -delete , use -exec rm {} + .