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

17

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

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

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

    
задан Luis Alvarado 18.01.2012 в 17:10
источник

3 ответа

9

Я предлагаю следующий сценарий bash

#!/bin/bash

cd /var/cache/apt/archives/
printf '%s\n' *.deb | 
  awk -F_ '{ print  }' |
  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 18.01.2012 в 20:48
источник
15

используйте параметр автозапуска для apt-get или aptitude

sudo apt-get autoclean
sudo aptitude autoclean

На странице man

  

чистый

     

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

     

Autoclean      

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

    
ответ дан Panther 18.01.2012 в 17:50
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
    
ответ дан Danial Behzadi 17.11.2015 в 22:01