当前位置: 首页>>技术教程>>正文


如何以只留下每个包的最新版本的方式清理 var/cache/apt

,

问题描述

我想知道一种清理 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,其中大部分只是旧包与新包混合在一起。

最佳方法

使用 apt-get 或 aptitude 的 autoclean 选项

sudo apt-get autoclean
sudo aptitude autoclean

从手册页

\\n

clean

\\n

clean clears out the local repository of retrieved package files.\\nIt removes everything but the lock file from /var/cache/apt/archives/ and /var/cache/apt/archives/partial/.

\\n

autoclean

\\n

Like clean, autoclean clears out the local repository of retrieved package files. The difference is that it only removes package files that can no longer be downloaded, and are largely useless. This allows a cache to be maintained over a long period without it growing out of control.

\\n

次佳方法

我建议使用以下 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

如果您对输出列表满意,请从 rm 行中删除 echo

它能做什么?

  1. 它列出了所有 deb 包文件

  2. 删除文件名中从第一个"_"到最后的所有内容,获取包名

  3. 对名称进行排序,删除重复项

  4. 对于每个名称\n

    1. 按时间顺序列出该名称对应的包文件

    2. 统计列表中包文件的数量

    3. 如果列表中有多个包\\n

      1. 从列表中删除第一个和较新的文件

      2. 从磁盘中删除与该名称对应的所有其他文件

通过仅列出根据 sortsort -u 之间的差异获得的包名称对应的包文件,可以提高效率。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14157.html,未经允许,请勿转载。