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 {} +
.