LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1465|回复: 6

[脚本]清理 pacman 缓存,但可以选择保留最近几个版本

[复制链接]
发表于 2009-4-12 05:39:25 | 显示全部楼层 |阅读模式
打算清理缓存,还想保留旧包以防万一的可以试试,修改里面的 KEEPN 变量即可。
  1. #!/bin/bash
  2. # 选择删除缓存中陈旧的包,可选择保留 N 个最新版本
  3. # 也许需要管理员权限,且删除前需要确认
  4. KEEPN=2 ### 要保留几个最新版本的包?
  5. IFS=$'\n'; CACHE='/var/cache/pacman/pkg'
  6. SED='s/\(.\{1,\}\)-\([0-9][a-z0-9\._]*-[0-9\.]\{1,\}\)/\1 \2/'
  7. # 用 sed 将缓存中的文件名分割成“软件包名称+空格+其它后缀的形式,并存入数组 list
  8. # 如 xsel-1.2.0-1.pkg.tar.gz 在数组中就是 "xsel -1.2.0-1.pkg.tar.gz"
  9. # 使用下面的 ls 命令请确保文件是按名称排序
  10. cd "$CACHE" && list=(`ls -1 "$CACHE" | sed -e "$SED"`)
  11. for ((i=0; i<${#list[@]}; i++)); do
  12.         # 取得软件包名称
  13.         pkgname=${list[$i]% *}   
  14.         # 如果系统里没有安装此包,将其删除
  15.         if ! pacman -Qq $pkgname>/dev/null 2>&1; then
  16.                 rm -i ${list[$i]// /-}
  17.                 continue
  18.         fi
  19.         # 如果出现重复的软件包名称,则更新重复计数器 dup
  20.         if [ "$pkgname" == "$prev" ]; then
  21.                 let "dup++"
  22.         else
  23.         # 如果计数器超过设置的 KEEPN,就开始清理
  24.                 if [ ${dup:-0} -gt $KEEPN ]; then
  25.                         echo "[$prev]: $dup packages"
  26.                         # 确定需要处理的数组上下标 ub 和 lb,用 let 赋值更会清晰一些
  27.                         ub=$(($i-1)); lb=$(($i-$dup))  
  28.                         # 用冒泡法将要处理的数组元素排序,版本旧的在前
  29.                         # 如够偷懒可以不排序,按修改时间判断包的新旧,可能不准
  30.                         for ((x=$lb; x<$ub; x++)); do
  31.                                 for ((y=$ub; y>$x; y--)); do
  32.                                         vercmp "${list[$y]// /-}" "${list[$(($y-1))]// /-}" > /dev/null
  33.                                         if [ $? -lt 0 ]; then
  34.                                                 t="${list[$y]}"
  35.                                                    list[$y]="${list[$(($y-1))]}"
  36.                                                 list[$(($y-1))]="$t"
  37.                                         fi
  38.                                 done
  39.                         done
  40.                         # 排序好之后,清理掉多余的包
  41.                         for ((z=0; z<$(($dup-$KEEPN)); z++)); do
  42.                                 rm -i "${list[$(($lb+$z))]// /-}"
  43.                         done
  44.                 fi
  45.                 dup=1 # 重置计数器 dup
  46.         fi
  47.         prev="$pkgname" # 记录上一个包的名称
  48. done
复制代码
发表于 2009-4-12 09:03:23 | 显示全部楼层
好贴,我一直想着实现这个功能,现在不用我搞了.支持   

建议判断包是否有用,一步到位,就是要删除不需要的包嘛.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-12 12:10:06 | 显示全部楼层
Post by 月魄孤魂;1973065
好贴,我一直想着实现这个功能,现在不用我搞了.支持   

建议判断包是否有用,一步到位,就是要删除不需要的包嘛.


在 pkgname=${list[$i]% *} 这句后面加个判断试试:


  1.         if ! pacman -Qq $pkgname>/dev/null 2>&1; then
  2.                 rm -i ${list[$i]// /-}
  3.                 continue
  4.         fi
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-4-12 12:59:00 | 显示全部楼层
果然是好贴,只是脚本看得有点晕
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-12 13:23:15 | 显示全部楼层
Post by axlrose;1973145
果然是好贴,只是脚本看得有点晕


还没来得及修改,如果大家觉得好,有空我改改,再加个注释。
回复 支持 反对

使用道具 举报

发表于 2009-4-12 20:48:34 | 显示全部楼层
好东西,收藏了

前段时间将该脚本更加人性化了一下!

http://archlive.googlecode.com/hg/small_shell_scripts/cleanold

用法: sudo sh ./cleanold [选项] -r <预清理目录>
选项:"
-f               删除前无需确认;
-a               没有安装的所有包也删除;
-r <DIR>         DIR 为预清理的目录;
-n <n>               n: 保留版本数默认为$KEEPN;
-h               帮助
回复 支持 反对

使用道具 举报

发表于 2009-4-12 21:14:01 | 显示全部楼层
好东西 支持个   我的cache都上G了 想删又舍不得全删 heh~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表