Cara membersihkan var / cache / apt sedemikian rupa sehingga hanya menyisakan versi terbaru dari setiap paket

18

Saya ingin tahu cara untuk membersihkan folder var / cache / apt dengan cara yang hanya meninggalkan versi terbaru dari sebuah paket jika memiliki beberapa versi atau meninggalkan paket jika itu adalah satu-satunya dari program itu.

Misalnya saya memiliki beberapa paket vlc (vlc_1.1.11, vlc_1.1.12 ..) dan beberapa paket anggur (wine1.3_1.3.34, wine1.3_1.3.35, wine1.3_1.3.36, wine1.3_1.3.37 ...) dan banyak lagi yang seperti ini.

Jadi bagaimana melakukan pembersihan di folder ini sehingga hanya menyisakan paket terbaru. Saat ini saya memiliki 2.5GB dan sebagian besar hanya paket yang lebih lama dicampur dengan yang baru.

Luis Alvarado
sumber

Jawaban:

9

Saya mengusulkan skrip bash berikut

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

Hapus echodari rmbaris jika Anda puas dengan daftar output.

Apa itu?

  1. Ini daftar semua file paket deb
  2. hapus semua nama file dari awal "_"hingga akhir, dapatkan nama paketnya
  3. urutkan nama, hapus duplikat
  4. untuk setiap nama

    1. daftar file paket yang sesuai dengan nama itu dalam urutan waktu
    2. hitung jumlah file paket dalam daftar
    3. jika ada lebih dari satu paket dalam daftar

      1. hapus dari daftar file pertama dan yang lebih baru
      2. hapus dari disk semua file lain yang sesuai dengan nama itu

Ini dapat ditingkatkan dalam efisiensi, dengan mendaftar hanya file paket yang sesuai dengan nama paket yang diperoleh dari perbedaan antara sortdan sort -u.

enzotib
sumber
Itu bekerja dengan sempurna. Saya juga memberikan +1 kepada bodhi karena autoclean juga membantu membersihkan sedikit. Jadi mungkin keduanya bersama-sama melakukan pekerjaan yang hebat. Terima kasih enzotib.
Luis Alvarado
16

gunakan opsi autoclean untuk apt-get atau aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Dari halaman manual

bersih

clean mengosongkan repositori lokal dari file paket yang diambil. Ini menghapus semuanya kecuali file kunci dari / var / cache / apt / arsip / dan / var / cache / apt / arsip / parsial /.

autoclean

Seperti clean, autoclean membersihkan repositori lokal dari file paket yang diambil. Perbedaannya adalah ia hanya menghapus file paket yang tidak lagi dapat diunduh, dan sebagian besar tidak berguna. Ini memungkinkan cache dipertahankan dalam jangka waktu lama tanpa membuatnya lepas kendali.

Harimau kumbang
sumber
Bisakah Anda menambahkan sudo aptitude autoclean. Autoclean dalam kedua kasus (apt-get dan aptitude) masih meninggalkan versi lama yang membuat lompatan besar seperti thunderbird 8.0 dan thundebird 9.0. Namun itu menghapus thinderbird 8.x paket yang lebih lama tetapi tetap seperti versi rilis lengkap tanpa mempertimbangkan bahwa 9.0 di atas 8.0. Ini hanya satu dari banyak kasus yang masih tersisa. Adakah ide lain untuk menghadapi jumlah paket lama ini?
Luis Alvarado
Maaf, jika autoclean tidak berfungsi, saya tidak tahu metode sederhana. Semoga orang lain memiliki saran yang lebih baik.
Panther
0

Saya mengusulkan skrip bash yang lebih mudah dibaca dan lebih manusiawi, berdasarkan pada algoritma enzotib , yang tidak menghapus file tambahan, seperti yang asli lakukan:

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