在dpkg.log和/var/lib/dpkg/info/找一批同时安装的包(写好的bash)

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

在dpkg.log和/var/lib/dpkg/info/找一批同时安装的包(写好的bash)

#1

帖子 eexpress » 2006-05-06 23:06

赶紧补充一句,有人用此脚本对系统原始安装的包操作过,而且按照提示删除了。这个要小心啊。因为最开始系统安装时,包没有明确按照依赖关系操作的,所以有可能把不应该删除的包都一起显示出来了。此脚本一般针对后面独立安装的包及其依赖包,这样才会正常。

第一种方法:简单些,只是操作/var/log/dpkg.log。适合于刚刚安装的软件,操作量小。

代码: 全选

#!/bin/bash

[ -z $1 ] && exit 1;
arg=$1
grep '[0-9]\ install' /var/log/dpkg.log>tmp
find=`awk '$4~/'$arg'/ {print $2}' tmp`    [color=red]#不知道awk如何执行{find=$2:0:5}这样的功能,只好输出到find,再有bash处理。[/color]
find=${find:0:5}
dpkg=`awk '$2~/'$find:[0-9][0-9]'/ {print $4} ' tmp`     [color=red]#目前只是判断了同一分钟的,需要判断上下2分钟内的。也是不知道awk如何执行{dpkg+=" "$4}这样的功能[/color]
echo sudo apt-get remove --purge $dpkg
执行结果如下:
exp@eexpress:~$ ./find-install-dpkg-group.sh 囗囗囗
sudo apt-get remove --purge libevent1 囗囗囗囗囗囗囗 囗囗囗囗囗囗 囗囗囗
exp@eexpress:~$ ./find-install-dpkg-group.sh eyed3
sudo apt-get remove --purge python2.4-eyed3 python-eyed3 eyed3
第二种方法:由于上面的操作,是读dpkg.log内容,有可能文件内容已经不包含所有包的信息,下面修改为另外一种操作。直接操作/var/lib/dpkg/info/目录。这样可以追溯系统的所有安装的包。

代码: 全选

#!/bin/bash

[ -z $1 ] && echo "输入一个正则表达式参数,指明需要查找的包。本bash将给出与指定包同时安装的那些依赖包的卸载命令。" &&exit 1;
arg=$1
cd /var/lib/dpkg/info/
ls -l -t *.list|awk '$5!=0 {gsub(".list","",$8); print $6"-"$7,$8}'>~/dpkg.list
awk '$2~/'$arg'/' ~/dpkg.list>~/tmp
echo 找到如下结果:
cat ~/tmp
t=`cat ~/tmp|wc -l`
[ $t -eq 0 ] && echo "没有找到任何包" && exit 1;
[ $t -gt 1 ] && echo "找到以上一系列包。但需要确定唯一的一个包。" && exit 1;
echo 可以使用以下命令,卸载全部与 `awk '{print $2}' ~/tmp` 同时安装的依赖的包
find=`awk '{print $1}' ~/tmp`
dpkg=`awk '$1~/'$find'/ {print $2} ' ~/dpkg.list`
echo --------------------------------------------
echo sudo apt-get remove --purge $dpkg
echo --------------------------------------------
cd ~
rm dpkg.list tmp
执行如下:
$ ./find-install-dpkg-group-1.sh eth
找到如下结果:
2006-03-14-05:23 ethtool
可以使用以下命令,卸载全部与 ethtool 同时安装的依赖的包
--------------------------------------------
sudo apt-get remove --purge tcpd ubuntu-keyring reiser4progs reiserfsprogs strace pciutils python netbase netcat net-tools ntpdate whiptail memtest86+ mii-diag libiw28 libsysfs2 libwrap0 lsb-release lsof libpopt0 libreiserfs0.3-0 libldap2 libncursesw5 libnewt0.51 libopencdk8 libtasn1-2 libusb-0.1-4 less libatm1 libgcrypt11 libgpg-error0 liblzo1 iputils-ping jfsutils grepmap ifupdown libgnutls12 libgpmg1 gettext-base eject ethtool libfribidi0 cpio console-common
--------------------------------------------
$ ./find-install-dpkg-group-1.sh amule
找到如下结果:
2006-03-26-18:25 amule
2006-03-26-18:25 amule-utils
找到以上一系列包。但需要确定唯一的一个包。
$ ./find-install-dpkg-group-1.sh amule$ <------使用正则表达式,确定唯一的包
找到如下结果:
2006-03-26-18:25 amule
可以使用以下命令,卸载全部与 amule 同时安装的依赖的包
--------------------------------------------
sudo apt-get remove --purge amule amule-utils
--------------------------------------------
上次由 eexpress 在 2006-05-22 12:51,总共编辑 4 次。
● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2006-05-06 23:12

这是为了方便大家平时测试软件写的。安装一个软件,发现不好用,或者不是需要的,新利得里面如果卸载,总会搞不清附带安装了那些包。
使用上面2个bash,就可以轻松的卸载,而且不会把同时也是其他软件需要的依赖包也卸载的。
安装时间操作的,没想好如何处理跨过一分钟安装的包如何处理。
● 鸣学
头像
myfavourite
帖子: 55
注册时间: 2006-04-24 14:20

#3

帖子 myfavourite » 2006-05-07 20:06

谢谢楼主共享,虽然现在暂时还没有用得上

正在学习bash中...
^偶的个性,偶的最爱^

----------------------------
回复