如何从本地存储库中删除相同包的旧版本?

在我的本地存储库中, 见下文 ,我有许多版本的相同软件包下载并存储在deb软件包目录中。 由于Ubuntu总是喜欢使用最高版本,因此我不需要下载和使用早期版本。 (所有都在同一个文件夹中)。

如何从本地deb文件夹中删除早期版本的软件包? 手动删除它们不是一个可行的解决方案。 (您无法检查数千个文件中的版本)

有任何想法吗?!!

也许一个脚本检查每个包的版本保留较新的版本和deletind较旧的版本可以解决这个问题。

我正在寻找这样的脚本,或者如果建立一些软件会很棒

我已经根据这个教程制作了我的本地存储库。

***本地存储库是已下载的软件包的脱机存储,因此您无需再次下载它

注意 :我不是指清除已下载软件包的缓存,可以使用apt-get clean命令完成。

我已经删除了相同软件包的旧版本。 我使用了dpkg-scanpackages的多版本扫描function的反转function。

  1. 首先安装dpkg-dev

     sudo apt-get install dpkg-dev 
  2. 然后生成一个文件,其名称为package(仅列出较新的文件) dpkg-scanpackages不带-m选项。 默认值为不带-m选项。

    如果在名为deb的文件夹中有.deb文件,请从该文件夹的父文件中运行以下命令

     dpkg-scanpackages deb /dev/null 2>/dev/null | grep Filename: > filenames 

    这将创建一个名为filenames的文件 ,其中所有.deb文件的名称都以Filename: deb/packagename_version.deb格式列出。

    我们现在将名为filenames的文件中包含最新版本的文件的所有名称

  3. 现在任务很简单,修改脚本以将所有这些文件移动到另一个文件夹中。

    1. 首先用mv替换Filename:

       sed -i 's/Filename:/mv/' filenames 
    2. 现在在deb文件夹的父目录中创建一个文件夹。 我把它命名为最新 (无垃圾可能是一个好的; P)。

    3. 再次更改文件名文件以在新创建的最新文件夹中移动.deb文件。

       sed -i 's/\.deb/.deb newest/' filenames 

      这将使我们的文件名文件成为mv命令列表,将.deb文件从deb目录移动到最新目录

    4. 现在猜猜是什么。 执行文件文件

       sh filenames 
    5. 最后一步是删除包含旧的过时.deb文件的文件夹。 检查最新文件夹也是一种预防措施。

用一个class轮更新

安装dpkg-dev软件包后,使用单个命令生成移动脚本,通过转到.deb文件的父文件夹来使用此命令。

  dpkg-scanpackages deb /dev/null 2>/dev/null | grep Filename: | sed 's/Filename:/mv/;s/\.deb/.deb newest/' > filenames 

然后创建一个名为newest的文件夹,并使用`sh filenames *命令执行文件文件

使用一个class轮更新要删除(不要移动)

这一个class轮只删除相同包的旧版本

以root身份运行它

 sudo dpkg-scanpackages /var/cache/apt/archives 2>&1 >/dev/null | grep -Po '((\/.*?deb)(?=.*?repeat;))|used that.*?\K(\/.*deb)' | xargs rm 

“/ var / cache / apt / archives”替换为.deb目录

它在Ubuntu 12.10中运行得非常好

我遇到了同样的问题:我使用apt-mirror创建了一个本地存储库,这个工具下载了新的包,但保留了所有旧的包。 我做了以下清理我的本地镜像:

  1. 在我的设置/var/spool/apt-mirror/mirror/ftp.nl.debian.org/debian中,转到镜像顶部的位置(dists和pool目录所在的目录)

  2. 创建池中所有包的列表:

     find pool -type f | sort -u > files 
  3. 创建镜像分发中所有包的列表:

     grep "^Filename:" `find dists/ -name Packages`|sed "s/^.*Filename: //"|sort -u > packages 
  4. 现在在两个文件之间创建一个diff并将其转换为清理脚本:

     diff files packages | sed "/^[1-9]/d;s/^< /rm /" > cleanup.sh 
  5. 执行生成的脚本

确保您对存储库具有写权限(或使用sudo执行)。 您也可以将文件移动到临时位置,而不是删除。

这背后的想法是您可以删除其中一个Packages文件中未提及的文件,因为它们被更新的版本替换或不推荐使用。 如果Packages文件中未提及文件,则连接到存储库的客户端无法找到这些文件。

来自“Anwar”的绝佳解决方法(在第一个答案中)! 只有这一行我会改变:

 sed -i 's/\.deb/.deb newest/' filenames 

因为如果你有一个名为:packagename.debian_123.deb的包,你的行只会替换这一行中的第一个“.deb”,最后看起来像这样:

 packagename.deb newest_123.deb 

改为使用此行,并且只替换每行中的最后一行.deb

 sed -i 's/\(.*\).deb/\1.deb newest/' filenames 

在Thunar:

  1. 打开/var/cache/apt/archives
  2. 根据访问时间选择文件:
    • 单击查看>>查看详细列表
    • 单击查看>>配置列>>启用访问日期
    • 单击Date Accessed表标题,对文件进行排序
    • 按住Ctrl键单击以选择多个文件,按住Shift键单击以选择一系列文件
  3. 通过右键单击>>删除(如果Thunar以足够的权限打开)或者删除文件:
    • 右键单击>>选择重命名
    • 选择“插入/覆盖”,设置自定义前缀
    • 打开一个终端, sudo rm /var/cache/apt/archives/customprefix*.deb