Exclua todos os arquivos (exceto os quatro mais novos) nos diretórios usando um script Bash

Exclua todos os arquivos (exceto os quatro mais novos) nos diretórios usando um script Bash

Estou procurando um script Bash que entre em uma lista de diretórios e exclua todos, exceto os quatro arquivos criados mais recentemente.

Como posso fazer isso?

Responder1

ls -t | sed '1,4d' | xargs echo rm

Remova o echoquando estiver satisfeito com o resultado que deseja.

Se você tiver nomes de arquivos com espaços, será necessário mais trabalho.

Responder2

Deseja manter os quatro arquivos mais recentes em cada diretório ou os quatro arquivos mais recentes em QUALQUER diretório?

Para resolver o primeiro problema, você usaria find para listar cada diretório e, em cada um, removeria todos os arquivos, exceto os quatro mais recentes. Isso não é muito difícil.

Para resolver o segundo problema é preciso um pouco mais de reflexão, mas na verdade é mais fácil de escrever.

Basicamente, encontre todos os arquivos recursivamente. Chame o comando “stat” retornando a hora e o nome da modificação do arquivo. Classifique numericamente em ordem decrescente e pule os primeiros quatro arquivos, que são os mais recentes.

Em seguida, remova os carimbos de data/hora iniciais e remova a lista resultante de nomes de arquivos.

Algo como (não testado):

#!/bin/bash

find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
    echo rm -v "${f}"
  done

Isso deve funcionar, embora você queira remover o 'eco' no loop while para torná-lo eficaz. Teste-o cuidadosamente primeiro!

Responder3

Sei que não é bem isso que você está perguntando, mas para esse tipo de backup prefiro girar os arquivos de log antes de criar um novo. É um pouco mais explícito e muito mais simples de codificar, assim:

#!/bin/bash

#Archive old backups
move () {
  if [ -e $1 ]
  then
    echo "Archiving old backups: $1 to $2"
    mv -f $1 $2 || echo "FAILED"
  fi
}

#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz

#Now create today's backup
...

Responder4

O método mais simples:

for d in dir1 dir2 dir3; do
  rm -vf `ls -1t $d | head -n-4` 
done

informação relacionada