Як очистити var / cache / apt таким чином, щоб він залишав лише останні версії кожного пакету


18

Я хочу знати спосіб очищення папки 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 Гб, і більшість з них є лише старими пакетами, змішаними з новими.

Відповіді:


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. У ньому перераховані всі файли пакету дебюту
  2. видаліть усе з імені файлу від першого "_"до кінця, отримавши назву пакета
  3. сортуйте імена, видаляючи дублікати
  4. для кожного імені

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

      1. видаліть зі списку перший і новіший файл
      2. видаліть з диска всі інші файли, відповідні цьому імені

Це можна було б покращити в ефективності, перерахувавши лише файли пакунків, що відповідають іменам пакетів, отриманим від різниці між sortта sort -u.


Це спрацювало чудово. Я також даю +1 для bodhi, тому що autoclean також допоміг у чищенні. Тож, можливо, обидва разом роблять велику роботу. Спасибі ензотибу.
Луїс Альварадо

16

використовуйте параметр autoclean для apt-get або здатності

sudo apt-get autoclean
sudo aptitude autoclean

Зі сторінки чоловіка

чистий

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

автокель

Як і чистий, autoclean очищає локальне сховище завантажених файлів пакетів. Різниця полягає в тому, що він видаляє лише файли пакетів, які вже не можна завантажувати, і в основному є марними. Це дозволяє зберігати кеш-пам'ять протягом тривалого періоду, не виходячи з-під контролю.


Чи можете ви додати sudo здатності autoclean. Також autoclean в обох випадках (apt-get і здатність) все ще залишає старіші версії, які роблять величезний стрибок, як thunderbird 8.0 та thundebird 9.0. Однак він видалив більш старі пакунки thinderbird 8.x, але він залишає як версії з повним випуском, не беручи до уваги, що 9.0 вище 8.0. Це лише один із багатьох випадків, які я поки що залишив. Будь-які інші ідеї для вирішення такої кількості старих пакетів?
Луїс Альварадо

Мені шкода, якщо авточистка не працювала, я не знаю простого методу. Сподіваюся, хтось інший має кращу пропозицію.
Пантера

0

Я пропоную більш простий і зрозумілий людський скрипт bash, заснований на алгоритмі enzotib , який не видаляє зайві файли, як оригінал do:

#! /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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.