Como limpar var / cache / apt de uma maneira que deixe apenas as versões mais recentes de cada pacote

18

Quero saber uma maneira de limpar a pasta var / cache / apt de uma maneira que deixe apenas a versão mais recente de um pacote se tiver várias versões ou deixe um pacote se for o único desse programa.

Por exemplo, eu tenho vários pacotes vlc (vlc_1.1.11, vlc_1.1.12 ..) e vários pacotes de vinho (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) e muitos outros assim.

Então, como fazer uma limpeza nessa pasta, deixando apenas os pacotes mais recentes. No momento, tenho 2,5 GB e a maioria são apenas pacotes mais antigos misturados com os mais novos.

Luis Alvarado
fonte

Respostas:

9

Proponho o seguinte script bash

#!/bin/bash

cd /var/cache/apt/archives/
printf '%s\n' *.deb | 
  awk -F_ '{ print $1 }' |
  sort -u | 
  while read pkg; do 
    pkg_files=($(ls -t "$pkg"_*.deb))
    nr=${#pkg_files[@]}
    if ((nr > 1)); then
      unset pkg_files[0]
      echo rm "${pkg_files[@]}"
    fi
  done

Remova o echoda rmlinha se estiver satisfeito com a lista de saída.

O que faz?

  1. Ele lista todos os arquivos do pacote deb
  2. remova tudo do nome do arquivo do primeiro "_"ao fim, obtendo o nome do pacote
  3. classifique os nomes, removendo duplicatas
  4. para cada nome

    1. listar os arquivos do pacote correspondentes a esse nome na ordem do tempo
    2. conte o número de arquivos de pacote na lista
    3. se houver mais de um pacote na lista

      1. remova da lista o primeiro e o mais recente arquivo
      2. remova do disco todos os outros arquivos correspondentes a esse nome

Pode ser aprimorado em eficiência, listando apenas os arquivos de pacotes correspondentes aos nomes de pacotes obtidos a partir da diferença entre sorte sort -u.

enzotib
fonte
Funcionou perfeitamente. Também estou dando um +1 ao bodhi porque o autoclean também ajudou na limpeza. Então, talvez os dois juntos façam um ótimo trabalho. Obrigado enzotib.
Luis Alvarado
16

use a opção autoclean para apt-get ou aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Na página do manual

limpar \ limpo

clean limpa o repositório local de arquivos de pacotes recuperados. Ele remove tudo, menos o arquivo de bloqueio de / var / cache / apt / archives / e / var / cache / apt / archives / parcial /.

auto-limpeza

Como limpo, o autoclean limpa o repositório local de arquivos de pacotes recuperados. A diferença é que ele remove apenas os arquivos do pacote que não podem mais ser baixados e são amplamente inúteis. Isso permite que um cache seja mantido por um longo período sem que ele fique fora de controle.

Pantera
fonte
Você pode adicionar o sudo aptitude autoclean. Além disso, o autoclean em ambos os casos (apt-get e aptitude) ainda deixa versões mais antigas que dão um grande salto, como o thunderbird 8.0 e o thundebird 9.0. No entanto, ele removeu os pacotes mais antigos do thinderbird 8.x, mas sai como nas versões completas, sem levar em consideração que 9.0 está acima de 8.0. Este é apenas um dos muitos casos que ainda me restam. Alguma outra idéia para enfrentar essa quantidade de pacotes mais antigos?
Luis Alvarado
Sinto muito, se o autoclean não funcionou, não conheço um método simples. Espero que alguém tenha uma sugestão melhor.
Pantera
0

Proponho um script bash legível mais simples e mais humano, baseado no algoritmo do enzotib , que não remove arquivos extras, como o original:

#! /usr/bin/env bash

cd /var/cache/apt/archives/
for pkg in `ls *.deb | cut -d _ -f 1 | sort -u`; do
    if [ $(ls $pkg\_* | wc -l) -gt 1 ]; then
        files=$(ls -vr $pkg\_*)
        rmfiles=`echo $files | cut -d " " -f 2-`
        rm -v $rmfiles
    fi
done
Danial Behzadi
fonte