So bereinigen Sie var / cache / apt so, dass nur die neuesten Versionen der einzelnen Pakete übrig bleiben

18

Ich möchte einen Weg kennen, um den Ordner var / cache / apt so zu bereinigen, dass er nur die neueste Version eines Pakets verlässt, wenn er mehrere Versionen hat, oder ein Paket verlässt, wenn er der einzige dieses Programms ist.

Zum Beispiel habe ich mehrere vlc-Pakete (vlc_1.1.11, vlc_1.1.12 ..) und mehrere Weinpakete (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) und viele andere mögen das.

So bereinigen Sie in diesem Ordner, dass nur die neuesten Pakete übrig bleiben. Im Moment habe ich 2,5 GB und das meiste sind nur ältere Pakete, gemischt mit den neueren.

Luis Alvarado
quelle

Antworten:

9

Ich schlage das folgende Bash-Skript vor

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

Entfernen Sie die echoaus der rmZeile, wenn Sie mit der Ausgabeliste zufrieden sind.

Was es macht?

  1. Es listet alle Deb-Paketdateien auf
  2. Entfernen Sie alle Elemente im Dateinamen von Anfang "_"bis Ende, um den Paketnamen zu erhalten
  3. sortiere die Namen und entferne Duplikate
  4. für jeden Namen

    1. Listen Sie die Paketdateien, die diesem Namen entsprechen, in zeitlicher Reihenfolge auf
    2. Zählen Sie die Anzahl der Paketdateien in der Liste
    3. wenn die Liste mehr als ein Paket enthält

      1. Entfernen Sie aus der Liste die erste und neuere Datei
      2. Entfernen Sie alle anderen Dateien, die diesem Namen entsprechen, von der Festplatte

Die Effizienz könnte verbessert werden, indem nur Paketdateien aufgelistet werden, die den Paketnamen entsprechen, die sich aus dem Unterschied zwischen sortund ergeben sort -u.

Enzotib
quelle
Es hat perfekt funktioniert. Ich gebe auch eine +1 an Bodhi, weil Autoclean auch beim Aufräumen ein bisschen geholfen hat. Vielleicht leisten beide zusammen eine großartige Arbeit. Danke Enzotib.
Luis Alvarado
16

Verwenden Sie die Autoclean-Option, um apt-get oder aptitude zu verwenden

sudo apt-get autoclean
sudo aptitude autoclean

Von der Manpage

reinigen

clean löscht das lokale Repository der abgerufenen Paketdateien. Es entfernt alles außer der Sperrdatei aus / var / cache / apt / archives / und / var / cache / apt / archives / partial /.

automatische Reinigung

Wie clean löscht autoclean das lokale Repository der abgerufenen Paketdateien. Der Unterschied besteht darin, dass nur Paketdateien entfernt werden, die nicht mehr heruntergeladen werden können und weitgehend unbrauchbar sind. Auf diese Weise kann ein Cache über einen langen Zeitraum beibehalten werden, ohne dass er außer Kontrolle gerät.

Panther
quelle
Können Sie sudo aptitude autoclean hinzufügen? Auch der Autoclean in beiden Fällen (apt-get und aptitude) hinterlässt noch ältere Versionen, die einen riesigen Sprung wie Thunderbird 8.0 und Thundebird 9.0 machen. Es hat jedoch die älteren Pakete von thinderbird 8.x entfernt, aber es bleibt wie die Vollversionen, ohne zu berücksichtigen, dass 9.0 über 8.0 liegt. Dies ist nur einer von vielen Fällen, die ich noch habe. Irgendwelche anderen Ideen, um sich dieser Menge älterer Pakete zu stellen?
Luis Alvarado
Es tut mir leid, wenn Autoclean nicht funktioniert hat, kenne ich keine einfache Methode. Hoffe, jemand anderes hat einen besseren Vorschlag.
Panther
0

Ich schlage ein einfacheres und besser lesbares Bash-Skript vor, das auf dem Enzotib- Algorithmus basiert und keine zusätzlichen Dateien entfernt, wie dies beim Original der Fall ist:

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