Jak wyczyścić var ​​/ cache / apt w taki sposób, że pozostawia tylko najnowsze wersje każdego pakietu

18

Chcę poznać sposób na wyczyszczenie folderu var / cache / apt w taki sposób, że pozostawia on najnowszą wersję pakietu tylko, jeśli ma kilka wersji lub pozostawia pakiet, jeśli jest to jedyny z tego programu.

Na przykład mam kilka pakietów vlc (vlc_1.1.11, vlc_1.1.12 ..) i kilka pakietów wina (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) i wielu innych takich.

Jak więc zrobić porządek w tym folderze, aby zostawił tylko najnowsze pakiety. W tej chwili mam 2,5 GB, a większość z nich to tylko starsze pakiety zmieszane z nowszymi.

Luis Alvarado
źródło

Odpowiedzi:

9

Proponuję następujący skrypt 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

Usuń linię echoz rmlinii, jeśli jesteś zadowolony z listy wyników.

Co to robi?

  1. Zawiera listę wszystkich plików pakietu deb
  2. usuń wszystko z nazwy pliku od pierwszego "_"do końca, uzyskując nazwę pakietu
  3. posortuj nazwy, usuwając duplikaty
  4. dla każdego imienia

    1. wyświetl listę pakietów odpowiadających tej nazwie w kolejności czasowej
    2. policz liczbę plików pakietów na liście
    3. jeśli na liście jest więcej niż jedna paczka

      1. usuń z listy pierwszy i nowszy plik
      2. usuń z dysku wszystkie inne pliki odpowiadające tej nazwie

Można poprawić efektywność, wymieniając tylko pliki pakietów odpowiadające nazwom pakietów uzyskanym z różnicy między sorti sort -u.

enzotib
źródło
Działa idealnie. Daję również +1 bodhi, ponieważ autoclean również pomógł trochę posprzątać. Więc może oboje razem wykonają świetną robotę. Dzięki enzotib.
Luis Alvarado,
16

użyj opcji autoclean, aby apt-get lub aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Ze strony podręcznika

czysty

clean czyści lokalne repozytorium pobranych plików pakietów. Usuwa wszystko oprócz pliku blokady z / var / cache / apt / archives / i / var / cache / apt / archives / częściowo /.

Automatyczne oczyszczanie

Podobnie jak czysty, autoclean czyści lokalne repozytorium pobranych plików pakietów. Różnica polega na tym, że usuwa tylko pliki pakietów, których nie można już pobrać i są w dużej mierze bezużyteczne. Pozwala to na utrzymanie pamięci podręcznej przez długi czas bez wymykania się spod kontroli.

Pantera
źródło
Czy możesz dodać sudo aptitude autoclean. Również autoclean w obu przypadkach (apt-get i aptitude) nadal pozostawia starsze wersje, które robią ogromny skok, jak thunderbird 8.0 i thundebird 9.0. Usunął jednak starsze pakiety thinderbird 8.x, ale pozostawia jak wersje pełne, nie biorąc pod uwagę, że 9.0 jest powyżej 8.0. To tylko jeden z wielu przypadków, które mi pozostały. Jakieś inne pomysły, aby zmierzyć się z taką ilością starszych pakietów?
Luis Alvarado,
Przykro mi, jeśli autoclean nie zadziałało, nie znam prostej metody. Mam nadzieję, że ktoś inny ma lepszą sugestię.
Panther
0

Proponuję prostszy i czytelniejszy dla człowieka skrypt bash, oparty na algorytmie enzotib , który nie usuwa dodatkowych plików, tak jak oryginał:

#! /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
źródło