Pertanyaan Cara membersihkan var / cache / apt dengan cara hanya menyisakan versi terbaru dari setiap paket


Saya ingin tahu cara membersihkan folder var / cache / apt dengan cara hanya meninggalkan versi terbaru dari paket jika memiliki beberapa versi atau meninggalkan paket jika itu adalah satu-satunya 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 yang hanya menyisakan paket terbaru. Saat ini saya memiliki 2,5GB dan sebagian besar hanya paket yang lebih tua dicampur dengan yang lebih baru.


17
2018-01-18 17:10


asal




Jawaban:


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 echo dari rm baris jika Anda puas dengan daftar output.

Apa yang dilakukannya?

  1. Ini daftar semua file paket deb
  2. hapus semua nama file dari yang pertama "_" sampai akhir, mendapatkan nama paket
  3. mengurutkan nama, menghapus duplikat
  4. untuk setiap nama

    1. daftar file paket yang terkait 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 terkait dengan nama itu

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


9
2018-01-18 20:48



Ini bekerja dengan sempurna. Saya juga memberikan +1 untuk bodhi karena autoclean juga membantu membersihkan sedikit. Jadi mungkin keduanya bersama melakukan pekerjaan hebat. Terima kasih, enzotib. - Luis Alvarado♦


gunakan opsi autoclean untuk apt-get atau aptitude

sudo apt-get autoclean
sudo aptitude autoclean

Dari halaman manual

bersih

membersihkan membersihkan repositori lokal dari file paket yang diambil.   Ini menghapus segalanya kecuali file kunci dari / var / cache / apt / archives / dan / var / cache / apt / archives / partial /.

autoclean

Seperti bersih, autoclean membersihkan repositori lokal dari file paket yang diambil. Perbedaannya adalah hanya menghapus file paket yang tidak dapat diunduh lagi, dan sebagian besar tidak berguna. Ini memungkinkan cache dipertahankan dalam waktu lama tanpa itu tumbuh di luar kendali.


15
2018-01-18 17:50



Bisakah Anda menambahkan autoclean dengan kemampuan sudo. Juga autoclean dalam kedua kasus (apt-get dan aptitude) masih meninggalkan versi lama yang membuat lompatan besar seperti thunderbird 8.0 dan thundebird 9.0. Itu namun menghapus paket 8.x thinderbird yang lebih tua tetapi meninggalkan seperti versi rilis penuh tanpa mempertimbangkan bahwa 9,0 di atas 8,0. Ini hanyalah satu dari banyak kasus yang masih saya tinggalkan. Ada gagasan lain untuk menghadapi jumlah paket lama ini? - Luis Alvarado♦
Saya minta maaf, jika autoclean tidak berhasil saya tidak tahu metode sederhana. Semoga orang lain memiliki saran yang lebih baik. - Panther


Saya mengusulkan skrip bash yang lebih mudah dibaca dan lebih mudah dipahami manusia, berdasarkan enzotib algoritma, 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

0
2017-11-17 22:01