Cómo limpiar var / cache / apt de manera que deje solo las últimas versiones de cada paquete

18

Quiero saber una forma de limpiar la carpeta var / cache / apt de manera que solo deje la última versión de un paquete si tiene varias versiones o deja un paquete si es el único de ese programa.

Por ejemplo, tengo varios paquetes vlc (vlc_1.1.11, vlc_1.1.12 ..) y varios paquetes de vino (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) y muchos otros como este

Entonces, ¿cómo hacer una limpieza en esta carpeta para que deje solo los paquetes más recientes? En este momento tengo 2.5GB y la mayoría son paquetes más antiguos mezclados con los más nuevos.

Luis Alvarado
fuente

Respuestas:

9

Propongo el siguiente 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

Elimine el echode la rmlínea si está satisfecho con la lista de salida.

¿Que hace?

  1. Enumera todos los archivos del paquete deb
  2. elimine todo en el nombre del archivo desde el principio "_"hasta el final, obteniendo el nombre del paquete
  3. ordenar los nombres, eliminando duplicados
  4. para cada nombre

    1. enumerar los archivos de paquete correspondientes a ese nombre en orden de tiempo
    2. cuenta el número de archivos de paquete en la lista
    3. si hay más de un paquete en la lista

      1. eliminar de la lista el primer y más reciente archivo
      2. eliminar del disco todos los demás archivos correspondientes a ese nombre

Podría mejorarse en eficiencia, enumerando solo los archivos de paquetes correspondientes a los nombres de paquetes obtenidos de la diferencia entre sorty sort -u.

enzotib
fuente
Funcionó perfectamente. También estoy dando un +1 a bodhi porque autoclean también ayudó a limpiar un poco. Entonces quizás ambos juntos hagan un gran trabajo. Gracias enzotib
Luis Alvarado
16

use la opción autoclean para apt-get o aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Desde la página del manual

limpiar

clean borra el repositorio local de archivos de paquetes recuperados. Elimina todo menos el archivo de bloqueo de / var / cache / apt / archives / y / var / cache / apt / archives / partial /.

limpieza automática

Al igual que clean, autoclean borra el repositorio local de archivos de paquetes recuperados. La diferencia es que solo elimina los archivos de paquete que ya no se pueden descargar y que son en gran medida inútiles. Esto permite mantener un caché durante un largo período sin que se salga de control.

Pantera
fuente
¿Se puede agregar sudo aptitude autoclean. Además, el autoclean en ambos casos (apt-get y aptitude) todavía deja versiones anteriores que hacen un gran salto como thunderbird 8.0 y thundebird 9.0. Sin embargo, eliminó los paquetes anteriores de thinderbird 8.x, pero deja como las versiones de lanzamiento completo sin tener en cuenta que 9.0 está por encima de 8.0. Este es solo uno de los muchos casos que aún me quedan. ¿Alguna otra idea para enfrentar esta cantidad de paquetes más antiguos?
Luis Alvarado
Lo siento, si autoclean no funcionó, no conozco un método simple. Espero que alguien más tenga una mejor sugerencia.
Pantera
0

Propongo un script bash más simple y más legible para humanos, basado en el algoritmo de enzotib , que no elimina archivos adicionales, como el 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
fuente