web-dev-qa-db-fra.com

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

Je souhaite connaître un moyen de nettoyer le dossier var/cache/apt de manière à ce qu'il ne laisse que la dernière version d'un package s'il existe plusieurs versions ou s'il ne contient qu'un seul programme de ce programme.

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

Alors, comment faire un nettoyage dans ce dossier qui 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.

18
Luis Alvarado

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 echode la ligne rmsi vous êtes satisfait de la liste de résultats.

Ce qu'il fait?

  1. Il liste tous les fichiers de paquets deb
  2. supprime tout le nom du fichier du premier "_" à la fin, en obtenant le nom du paquet
  3. trier les noms, enlever les doublons
  4. pour chaque nom

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

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

Son efficacité pourrait être améliorée en ne répertoriant que les fichiers de package correspondant aux noms de package obtenus à partir de la différence entre sortet sort -u.

9
enzotib

utilisez l'option autoclean pour apt-get ou aptitude

Sudo apt-get autoclean
Sudo aptitude autoclean

De 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 que cela ne supprime que les fichiers de paquet qui ne peuvent plus être téléchargés et qui sont en grande partie inutiles. Cela permet de conserver un cache sur une longue période sans qu'il ne devienne hors de contrôle.

16
Panther

Je propose un script bash plus simple, 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
0
Danial Behzadi