如何以仅保留每个软件包最新版本的方式清理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.5GB,其中大多数只是旧软件包和较新的软件包混合在一起。

Answers:


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

如果对输出列表感到满意,请echorm行中删除。

它能做什么?

  1. 列出所有deb软件包文件
  2. 从头到尾删除文件名中的所有内容"_",获取程序包名称
  3. 对名称进行排序,删除重复项
  4. 每个名字

    1. 按时间顺序列出与该名称对应的软件包文件
    2. 计算列表中软件包文件的数量
    3. 如果列表中有多个包裹

      1. 从列表中删除第一个和更新的文件
      2. 从磁盘删除与该名称对应的所有其他文件

它可以在效率,列出相应套餐之差而得到名称仅包文件加以改进,sortsort -u


效果很好。我也给菩提+1,因为自动清理功能确实有助于清理。因此,也许两者一起做得很好。感谢enzotib。
路易斯·阿尔瓦拉多

16

使用autoclean选项进行apt-get或aptitude

sudo apt-get autoclean
sudo aptitude autoclean

从手册页

清洁

clean清除检索到的软件包文件的本地存储库。它从/ var / cache / apt / archives /和/ var / cache / apt / archives / partial /中删除除锁定文件之外的所有内容。

自动清洁

像clean一样,autoclean会清除本地本地存储库中提取的软件包文件。不同之处在于,它仅删除不再下载且几乎无用的软件包文件。这使得高速缓存可以长期维护,而不会失去控制。


您可以添加sudo aptitude autoclean吗?同样,在这两种情况下(apt-get和aptitude)的自动清理仍会留下较旧的版本,这些版本如Thunderbird 8.0和thundebird 9.0发生了巨大的变化。但是,它确实删除了Thinderbird 8.x较旧的软件包,但是它像完整发行版一样保留,而没有考虑9.0高于8.0。这只是我仍然离开的许多情况之一。还有其他想法要面对这么多的旧软件包吗?
路易斯·阿尔瓦拉多

很抱歉,如果自动清洁不起作用,我不知道有一个简单的方法。希望其他人有更好的建议。

0

我基于enzotib的算法,提出了一个更简单,更易理解的 bash脚本,该脚本不会像原来那样删除多余的文件:

#! /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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.