Comment nettoyer var / cache / apt de manière à ne laisser que les dernières versions de chaque paquet

18

Je veux savoir comment nettoyer le dossier var / cache / apt de manière à ce qu'il ne laisse que la dernière version d'un paquet s'il a plusieurs versions ou qu'il laisse un paquet s'il est le seul de ce programme.

Par exemple, j'ai plusieurs packages vlc (vlc_1.1.11, vlc_1.1.12 ..) et plusieurs packages wine (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) et bien d'autres comme ça.

Alors, comment faire un nettoyage dans ce dossier pour qu'il ne laisse que les derniers packages. Pour le moment, j'ai 2,5 Go et la plupart ne sont que des paquets plus anciens mélangés aux plus récents.

Luis Alvarado
la source

Réponses:

9

Je propose le script bash suivant

#!/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

Supprimez le echode la rmligne si vous êtes satisfait de la liste de sortie.

Ce qu'il fait?

  1. Il répertorie tous les fichiers du paquet deb
  2. supprimez tout dans le nom de fichier du premier "_"à la fin, en obtenant le nom du package
  3. trier les noms, supprimer les doublons
  4. pour chaque nom

    1. répertorier les fichiers de package correspondant à ce nom dans l'ordre chronologique
    2. compter le nombre de fichiers de package dans la liste
    3. s'il y a plus d'un paquet dans la liste

      1. supprimer de la liste le premier et le plus récent fichier
      2. supprimer du disque tous les autres fichiers correspondant à ce nom

Il pourrait être amélioré en termes d'efficacité en listant uniquement les fichiers de package correspondant aux noms de package obtenus à partir de la différence entre sortet sort -u.

enzotib
la source
Cela a parfaitement fonctionné. Je donne également un +1 à Bodhi parce que l'autoclean a également aidé à nettoyer un peu. Alors peut-être que les deux ensemble font un excellent travail. Merci enzotib.
Luis Alvarado
16

utiliser l'option autoclean pour apt-get ou aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Depuis la page de manuel

nettoyer

clean efface le référentiel local des fichiers de package récupérés. Il supprime tout sauf le fichier de verrouillage de / var / cache / apt / archives / et / var / cache / apt / archives / partial /.

autoclean

Comme clean, autoclean efface le référentiel local des fichiers de package récupérés. La différence est qu'il supprime uniquement les fichiers de package qui ne peuvent plus être téléchargés et sont largement inutiles. Cela permet de maintenir un cache sur une longue période sans qu'il ne devienne incontrôlable.

Panthère
la source
Pouvez-vous ajouter sudo aptitude autoclean. De plus, l'autoclean dans les deux cas (apt-get et aptitude) laisse toujours des versions plus anciennes qui font un énorme saut comme thunderbird 8.0 et thundebird 9.0. Il a cependant supprimé les anciens packages de thinderbird 8.x mais il reste comme les versions complètes sans tenir compte du fait que 9.0 est supérieur à 8.0. Ce n'est qu'un des nombreux cas qu'il me reste. Avez-vous d'autres idées pour faire face à cette quantité d'anciens packages?
Luis Alvarado
Je suis désolé, si l'autoclean n'a pas fonctionné, je ne connais pas de méthode simple. J'espère que quelqu'un d'autre a une meilleure suggestion.
Panther
0

Je propose un script bash plus simple et plus lisible par l'homme, basé sur l' algorithme enzotib , qui ne supprime pas les fichiers supplémentaires, comme le fait l'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
la source