Eu faço essa tarefa regularmente e uso variantes do seguinte. É um pipeline que combina várias ferramentas simples: Encontre todos os arquivos, prefixar o horário de modificação do arquivo, classificar, remover o tempo de modificação do arquivo, exibir todas as linhas, exceto as 500 primeiras, e removê-las:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | tail -n +501 | \
while read file; do rm -f -- "$file"; done
Alguns comentários:
-
Se você está usando “bash”, você deve usar “read -r file”, não apenas “read file”.
-
Usar “perl” para remover os arquivos é mais rápido (e também lida com caracteres “estranhos” nos nomes de arquivos melhor que o loop while, a menos que você esteja usando “read -r file”):
... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
-
Algumas versões do “tail” não suportam a opção “-n”, então você deve usar “tail +501”. Uma maneira portátil de pular as 500 primeiras linhas é
... | perl -wnle 'print if $. > 500' | ...
-
Não funcionará se seus nomes de arquivo contiverem novas linhas.
-
Não requer o GNU find.
Combinar o que foi mencionado acima fornece:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'