[讨论]有个问题不知道大家是怎么解决的

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
头像
5451vs5451
帖子: 345
注册时间: 2006-07-14 18:56
来自: Apple Valley, Planet Tux, Linux System

[讨论]有个问题不知道大家是怎么解决的

#1

帖子 5451vs5451 » 2006-08-02 19:06

比如说,我想要安装某个软件包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

#2

帖子 jarryson » 2006-08-02 20:15

我也想知道

我想你说的是怎么在卸载一个软件的时候把当初安装的依赖库文件一起删除?

这个我觉得不能实现

既然是库文件 那你安装这个软件需要 另一个可能也需要

系统不可能建议你一起删除所有有关的库文件的

我一般是看到依赖非常多的就不安装了

要安装也是把所有依赖都记下

好像没有别的方法

看有没有有关记录软件 方便点
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#3

帖子 eexpress » 2006-08-02 21:43

我发过一个find-install-packagexxxx.bash的帖子。就是找一次安装中的所有包的记录,可以试试。很简单的原理。
● 鸣学
头像
5451vs5451
帖子: 345
注册时间: 2006-07-14 18:56
来自: Apple Valley, Planet Tux, Linux System

#4

帖子 5451vs5451 » 2006-08-02 23:36

eexpress 写了:我发过一个find-install-packagexxxx.bash的帖子。就是找一次安装中的所有包的记录,可以试试。很简单的原理。
大哥您发过的帖子太多了,实在不好找,能直接给个链接吗?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

有几种提示的。

#5

帖子 eexpress » 2006-08-03 0:02

代码: 全选

$ 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

#6

帖子 5451vs5451 » 2006-08-03 9:12

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一并删除。由此可见根据安装时间决定应该删除那些软件包,这种方法是很不精确的,只能严格根据依赖关系进行操作。
依赖关系因该是保留在系统上的某个位置,但是如何获取这些信息呢?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#7

帖子 eexpress » 2006-08-09 13:16

是啊。我的这个是用于一般的测试软件。比如安装一个软件,过2天又删除。依赖关系分析太复杂,apt-get show就可以看到。一般都一堆。会导致搜索效率的猛降。
● 鸣学
头像
5451vs5451
帖子: 345
注册时间: 2006-07-14 18:56
来自: Apple Valley, Planet Tux, Linux System

#8

帖子 5451vs5451 » 2006-08-15 22:23

原来安装过的(包括已经卸载的)软件包的信息和它们之间的依赖关系都保存在/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
}
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#9

帖子 eexpress » 2006-08-15 23:09

nnd,真的用awk啊。
你这没--help。不知道带什么参数。
● 鸣学
头像
5451vs5451
帖子: 345
注册时间: 2006-07-14 18:56
来自: Apple Valley, Planet Tux, Linux System

#10

帖子 5451vs5451 » 2006-08-16 8:38

命令名后面直接跟要卸载的软件包的名称就行了。例如要删除A1 A2 ... An,假设脚本名称为rmpkg,则使用命令:

代码: 全选

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]
wweeii
帖子: 21
注册时间: 2006-07-29 2:44

#11

帖子 wweeii » 2006-08-16 11:11

可以用deborphan软件
deborphan能列出系统里所有用不到的包

sudo apt-get remove `deborphan`
命令可以自动删掉所有deborphan扫出来的结果
头像
5451vs5451
帖子: 345
注册时间: 2006-07-14 18:56
来自: Apple Valley, Planet Tux, Linux System

#12

帖子 5451vs5451 » 2006-08-16 11:45

wweeii 写了:可以用deborphan软件
deborphan能列出系统里所有用不到的包

sudo apt-get remove `deborphan`
命令可以自动删掉所有deborphan扫出来的结果
很好用的工具。 :P
头像
bricksun
帖子: 85
注册时间: 2006-05-13 8:17
来自: 比京

#13

帖子 bricksun » 2006-08-16 23:36

顶deborphan,相当不错。以后可以随便安装卸载软件了,不再害怕系统变得臃肿。看来还有很多优秀的工具有待我们去挖掘。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#14

帖子 eexpress » 2006-08-18 0:13

使用 dialog的。老式软件了哦。有些担心不兼容。
安装了个gtkorphan。
● 鸣学
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#15

帖子 xiehuoli » 2006-08-18 9:10

可以用deborphan软件
deborphan能列出系统里所有用不到的包

sudo apt-get remove `deborphan`
命令可以自动删掉所有deborphan扫出来的结果


deborphan 怎么使用阿!我在终端机输入他,但是没有看见启动阿 !又没有什么图标!
那位能告诉我使用方法吗?
谢谢!
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
回复