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

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

Overview

Chegou a hora de dar uma geral nos backups antigos e liberar aquele espaço em disco que você tanto precisa! Quer sejam fotos de família, documentos importantes ou apenas backups que se acumularam desde 1990, é importante manter tudo organizado. Neste post, vamos mergulhar no mundo dos comandos, tanto para usuários de Linux quanto Windows, ensinando uma maneira prática e rápida de limpar esses arquivos .zip antigos. Deixe apenas os 5 últimos backups e diga adeus à desordem digital!

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.