[讨论]有个问题不知道大家是怎么解决的
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
- 5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
[讨论]有个问题不知道大家是怎么解决的
比如说,我想要安装某个软件包some-software,
apt-get install some-software
然后apt根据依赖关系安装了下列软件包,
depend1 depend2 ... dependn some-software
装好并试用一段时间后,我发现some-software根本不能提供我所需要的功能,因此打算卸载该软件包。现在的问题是,如果用,
apt-get remove some-software
则只能删除some-software,而与之同时安装的depend1 depend2 .... dependn不会被卸载。而用
apt-get remove depend1 depend2 ... dependn some-software
则不是明智之举。一是在some-software安装之后,我可能安装了某些软件包,而这些软件包又依赖于depend1 depend2 ... dependn中的一些;二是多数情况下,我在安装的时候可能根本没有保存depend1 depend2 ... dependn some-software这个长长的列表。怎样做才能恰到好处呢?
apt-get install some-software
然后apt根据依赖关系安装了下列软件包,
depend1 depend2 ... dependn some-software
装好并试用一段时间后,我发现some-software根本不能提供我所需要的功能,因此打算卸载该软件包。现在的问题是,如果用,
apt-get remove some-software
则只能删除some-software,而与之同时安装的depend1 depend2 .... dependn不会被卸载。而用
apt-get remove depend1 depend2 ... dependn some-software
则不是明智之举。一是在some-software安装之后,我可能安装了某些软件包,而这些软件包又依赖于depend1 depend2 ... dependn中的一些;二是多数情况下,我在安装的时候可能根本没有保存depend1 depend2 ... dependn some-software这个长长的列表。怎样做才能恰到好处呢?
- jarryson
- 帖子: 4002
- 注册时间: 2005-08-14 19:53
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- 5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
有几种提示的。
代码: 全选
$ find-dpkg-group.bash gxmame
找到如下结果:
2006-06-10-20:13 gxmame
可以使用以下命令,卸载全部与 gxmame 同时安装的依赖的包
--------------------------------------------
sudo apt-get remove --purge gxmame
--------------------------------------------
代码: 全选
$ find-dpkg-group.bash anjuta
找到如下结果:
2006-07-31-22:29 anjuta-2.0.2
可以使用以下命令,卸载全部与 anjuta-2.0.2 同时安装的依赖的包
--------------------------------------------
sudo apt-get remove --purge libgdl-1-common libgbf-1-0 libgbf-1-common libgdl-1-0 anjuta-2.0.2
--------------------------------------------
代码: 全选
$ find-dpkg-group.bash libgdl
找到如下结果:
2006-07-31-22:29 libgdl-1-common
2006-07-31-22:29 libgdl-1-0
找到以上一系列包。但需要确定唯一的一个包。
- 附件
-
- [find-dpkg-group.bash](2006-08-03 00-05-17).tar.gz
- (709 Bytes) 已下载 24 次
● 鸣学
- 5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
find-dpkg-group.bash我已经拜读了,深受启发。同时也发现了两个问题。
首先,正如我在前面提到的,在some-software安装之后,我可能安装了某些软件包,而这些软件包又依赖于depend1 depend2 ... dependn中的一些。此时如果使用find-dpkg-group.bash进行卸载,势必会将一些有用的软件包一起卸载掉。
其次,考虑下面这种情况
apt-get install A B
......
the following extra packages will be installed
dependA1 dependA2 ... dependAn dependB1 dependB2 ... dependBn A B
......
现在,如果我用find-dpkg-group.bash卸载A,必然将B一并删除。由此可见根据安装时间决定应该删除那些软件包,这种方法是很不精确的,只能严格根据依赖关系进行操作。
依赖关系因该是保留在系统上的某个位置,但是如何获取这些信息呢?
首先,正如我在前面提到的,在some-software安装之后,我可能安装了某些软件包,而这些软件包又依赖于depend1 depend2 ... dependn中的一些。此时如果使用find-dpkg-group.bash进行卸载,势必会将一些有用的软件包一起卸载掉。
其次,考虑下面这种情况
apt-get install A B
......
the following extra packages will be installed
dependA1 dependA2 ... dependAn dependB1 dependB2 ... dependBn A B
......
现在,如果我用find-dpkg-group.bash卸载A,必然将B一并删除。由此可见根据安装时间决定应该删除那些软件包,这种方法是很不精确的,只能严格根据依赖关系进行操作。
依赖关系因该是保留在系统上的某个位置,但是如何获取这些信息呢?
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- 5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
原来安装过的(包括已经卸载的)软件包的信息和它们之间的依赖关系都保存在/var/lib/dpkg/status里面了。
代码: 全选
#!/usr/bin/awk -f
BEGIN {
indent = ""
if (ARGC < 2) {
exit
}
for (i = 1; i < ARGC; i++) {
del[ARGV[i]] = 1
}
ARGC = 2
ARGV[1] = "/var/lib/dpkg/status"
}
/^Package:/ {
name = $2
next
}
/^Status:/ {
if ($4 == "not-installed") {
while (getline > 0 && NF > 0)
}
else {
package[name] = "keep"
depends[name, 0] = 1
}
next
}
/^Depends:|^Suggests:|^Recommends:/ {
gsub(/ |\([^)]*\)|^[a-zA-z]*:/, "")
split($0, tmp, ",|\|")
for (i in tmp) {
for (j = 0; j < depends[name, 0]; j++) {
if (depends[name, j] == tmp[i]) {
depends[name, 0]--
break
}
}
depends[name, j] = tmp[i]
depends[name, 0]++
}
}
function set(root, value, i) {
if (package[root] == "keep" || package[root] == "del") {
package[root] = value
for (i = 1; i < depends[root, 0]; i++) {
if (package[depends[root, i]] != value) {
indent = indent" "
set(depends[root, i], value)
gsub(/ $/,"",indent)
}
}
}
}
END {
for (pkg in del) {
set(pkg, "del")
}
for (pkg in package) {
if (package[pkg] == "keep") {
set(pkg, "keep")
}
}
for (pkg in package) {
if (package[pkg] == "del") {
npkgs++
list = list" "pkg
printf("%s ", pkg)
}
}
print
}
- 5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
命令名后面直接跟要卸载的软件包的名称就行了。例如要删除A1 A2 ... An,假设脚本名称为rmpkg,则使用命令:
脚本将按照如下方式工作:
1. 首先从/var/lib/dpkg/status中读取依赖关系信息,存入数组depends[name,index]中(其中name为软件包名称。对于每个包depends[name,0]中保存该软件包依赖于的其他软件包的个数。)并且定义数组元素package[name],将它的值设置为"keep"。这个过程中忽略了已经完全卸载的包,但是包括了已经卸载但是还保留有配置文件的包。
2. 对于指定列表中的包Ai,利用depends数组中的信息,找出所有Ai直接或者间接依赖于的包,将相应的package元素的值设置为"del"。
3. 对于相应package元素值为"keep"的包,利用depends数组中的信息,找出所有它直接或者间接依赖于的包,将相应的package元素的值设置为"keep"。
4. 打印输出所有package元素值为"del"的包。
刚开始写的时候用的
#/bin/sh
awk '
.......
' /var/lib/dpkg/status $@
这种格式,所以没有写注释。
[/list]
代码: 全选
rmpkg A1 A2 ... An
1. 首先从/var/lib/dpkg/status中读取依赖关系信息,存入数组depends[name,index]中(其中name为软件包名称。对于每个包depends[name,0]中保存该软件包依赖于的其他软件包的个数。)并且定义数组元素package[name],将它的值设置为"keep"。这个过程中忽略了已经完全卸载的包,但是包括了已经卸载但是还保留有配置文件的包。
2. 对于指定列表中的包Ai,利用depends数组中的信息,找出所有Ai直接或者间接依赖于的包,将相应的package元素的值设置为"del"。
3. 对于相应package元素值为"keep"的包,利用depends数组中的信息,找出所有它直接或者间接依赖于的包,将相应的package元素的值设置为"keep"。
4. 打印输出所有package元素值为"del"的包。
刚开始写的时候用的
#/bin/sh
awk '
.......
' /var/lib/dpkg/status $@
这种格式,所以没有写注释。
[/list]
-
- 帖子: 21
- 注册时间: 2006-07-29 2:44
- 5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
- bricksun
- 帖子: 85
- 注册时间: 2006-05-13 8:17
- 来自: 比京