Как очистить var / cache / apt таким образом, чтобы он оставлял только последние версии каждого пакета

18

Я хочу знать способ очистки папки var / cache / apt таким образом, чтобы она оставляла только последнюю версию пакета, если она имеет несколько версий, или она оставляет пакет, если он является единственным из этой программы.

Например, у меня есть несколько пакетов vlc (vlc_1.1.11, vlc_1.1.12 ..) и несколько пакетов wine (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) и многие другие, как это.

Так как сделать очистку в этой папке, чтобы в ней оставались только самые последние пакеты. На данный момент у меня есть 2,5 ГБ, и большинство из них просто старые пакеты, смешанные с более новыми.

Луис Альварадо
источник

Ответы:

9

Я предлагаю следующий скрипт 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

Удалите echoиз rmстроки, если вас устраивает список вывода.

Что оно делает?

  1. В нем перечислены все файлы пакета deb
  2. удалить все в имени файла от первого "_"до конца, получив имя пакета
  3. сортировать имена, удаляя дубликаты
  4. для каждого имени

    1. перечислить файлы пакета, соответствующие этому имени, во временном порядке
    2. подсчитать количество файлов пакета в списке
    3. если в списке более одной упаковки

      1. удалить из списка первый и более новый файл
      2. удалить с диска все остальные файлы, соответствующие этому имени

Это можно повысить по эффективности, перечислив только файлы пакетов, соответствующие именам пакетов, полученным из разницы между sortи sort -u.

enzotib
источник
Это сработало отлично. Я также даю +1 к бодхи, потому что autoclean также немного помог в уборке. Так что, может быть, оба вместе делают отличную работу. Спасибо энзотиб.
Луис Альварадо
16

используйте опцию autoclean для apt-get или aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Со страницы руководства

чистый

clean очищает локальный репозиторий полученных файлов пакетов. Он удаляет все, кроме файла блокировки, из / var / cache / apt / archives / и / var / cache / apt / archives / частичный /.

Автоматическая очистка

Как и в случае очистки, autoclean очищает локальный репозиторий извлеченных файлов пакетов. Разница в том, что он удаляет только те файлы пакетов, которые больше не могут быть загружены и в основном бесполезны. Это позволяет поддерживать кэш-память в течение длительного периода без выхода из-под контроля.

пантера
источник
Можете ли вы добавить sudo aptitude autoclean. Кроме того, автоочистка в обоих случаях (apt-get и aptitude) все еще оставляет старые версии, которые делают огромный скачок, как thunderbird 8.0 и thundebird 9.0. Однако он удалил старые пакеты thinderbird 8.x, но оставил их как полные версии без учета того, что 9.0 выше 8.0. Это только один из многих случаев, которые я до сих пор оставил. Любые другие идеи, чтобы столкнуться с таким количеством старых пакетов?
Луис Альварадо
Прошу прощения, если автоочистка не сработала, я не знаю простого метода. Надеюсь, у кого-то есть лучшее предложение.
Пантера
0

Я предлагаю более простой и понятный человеку bash-скрипт, основанный на алгоритме enzotib , который не удаляет лишние файлы, как это делает оригинал:

#! /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
Даниал Бехзади
источник