Apagando todos os arquivos de um diretório, exceto X mais recentes

Situação: Você possui um diretório com arquivos de backup, mas eles estão ocupando muito espaço e você não precisa de ter todos os backups desde 1990, apenas os 5 últimos.  Os exemplos abaixo mostram como fazer isso tanto no Windows quanto no Linux.

Vamos supor que você possui outros arquivos no diretório, mas quer apagar apenas os .zip

No Linux:

ls -tp *.zip | grep -v '/$' | tail -n +6 | tr '\n' '\0' | xargs -0 rm --

Explicando um pouco os comandos acima:

  • ls -tp *.zip:  Lista todos os arquivos .zip do diretório corrente, colocando os mais novos (data de modificação mais recente). Além disso exibe diretórios com uma barra (/) no final;
  • grep -v ‘/$’: Remove os diretórios da lista recebida do comando anterior. (Se existir um link simbólico para um diretório, este comando não conseguirá remove-lo da lista);
  • tail -n +6: Elimina os 5 primeiros itens da listagem, deixando apenas o arquivo de número 6 para frente. Desta forma, da lista de arquivos obtida na primeira parte deste comando, os 5 mais novos não estarão mais listados;
  • tr ‘\n’ ‘\0’: converte os caracteres de quebra de linha (\n) com um delimitador (\0);
  • xargs -0 rm —: processa a lista de arquivo em sequencias de argumentos de um tamanho aceitável para ser utilizado com o comando de remoção de arquivos. Após processa-la, envia a lista de arquivos para o comando rm. O argumento — serve para garantir que arquivos com nomes iniciados com – não sejam confundidos com argumentos do comando rm.

 

 

No Windows…

…Utilizando Batch:

for /f "skip=5 eol=: delims=" %%F in ('dir /b /o-d *.zip') do @del "%%F"

O comando acima é razoavelmente mais simples de explicar do que o comando do Linux. Neste comando, fazemos um simples for, ‘pulando’ os 5 primeiros registros. Os dados que alimentam este for é o comando dir. Para cada arquivo (%%F) será executado o comando del (@del).

 

… Utilizando PowerShell:

gci C:\temp\*.zip -Recurse | where{ -not $_.PsIsContainer } | sort CreationTime -desc | select -Skip 5 | Remove-Item -Force

O comando acima seleciona os arquivos de forma recursiva, filtra os que são diretórios, organiza a lista por data de criação, seleciona os arquivos por data de criação e (finalmente) os remove.

 

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Conhecimento Técnico, Dev, Linux/Bash and tagged , , , , , , .

One Comment

  1. Pingback: Apagando arquivos com mais de X dias (Linux/Bash) – Raccoon Ninja

Comments are closed.