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.
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 echo
de la ligne rm
si vous êtes satisfait de la liste de résultats.
Ce qu'il fait?
"_"
à la fin, en obtenant le nom du paquetpour chaque nom
s'il y a plus d'un paquet dans la liste
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 sort
et sort -u
.
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.
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