LinuxSir.cn,穿越时空的Linuxsir!

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

问一个非常苦恼的问题。如何知道删除包之后,遗留下了什么文件【已解决】

[复制链接]
发表于 2012-1-27 15:10:51 | 显示全部楼层 |阅读模式
每次都是因为这个重新安装的系统,因为安装了某个大一点的软件,感觉不好删除后,心里总感觉会留下一些文件(windows里的软件经常这么干),所以会很不踏实,就重新安装了。
有没有办法,彻底删除这个软件的所有文件或配置文件?
发表于 2012-1-27 16:40:46 | 显示全部楼层
可以看一下linux文件树的标准,一般配置文件都在/etc或者~下。而且配置文件都是文本文件,不会很大。库文件除非有依赖,一般不会有遗留的。
回复 支持 反对

使用道具 举报

发表于 2012-1-27 17:35:13 | 显示全部楼层
曾经也有过类似的问题,
自己不妨尝试用qfile -o 在/usr/share/目录试试,
或者搜索本版版友的相关帖子!

结论是:确实有残留文件!
回复 支持 反对

使用道具 举报

发表于 2012-1-27 19:38:55 | 显示全部楼层
这个问题换个角度就是:能否得孤立文件列表?(不属于任何pkg的文件)
这样就一目了然了。

我有一个初步的想法,不过目前还不会写这个脚本。

理论上说qfile -o $(find / *)可以做到该 功能,但是实际上:
fpemud-workstation / # qfile -o $(find / *)
bash: /usr/bin/qfile: Argument list too long
fpemud-workstation / #

相关连接:
http://www.linuxsir.cn/bbs/showt ... amp;highlight=qfile
回复 支持 反对

使用道具 举报

发表于 2012-1-27 22:34:48 | 显示全部楼层
警告:不要轻易删除qfile -o给出的孤立文件,除非您清楚该文件的用途。原因见下文。

您基本可以忽略遗留文件的问题,只要注意把/home下该程序的配置文件删除就好,因为... 原因见下文。

关于easior lars的说法,还是见下文...
Post by fpemud;2159192
这个问题换个角度就是:能否得孤立文件列表?(不属于任何pkg的文件)
这样就一目了然了。

我有一个初步的想法,不过目前还不会写这个脚本。

理论上说qfile -o $(find / *)可以做到该 功能,但是实际上:
fpemud-workstation / # qfile -o $(find / *)
bash: /usr/bin/qfile: Argument list too long
fpemud-workstation / #  


  • 这个错误是bash自己的问题。因为,您给qfile命令提供了超过20万个参数。
  • 首先,给出一个看起来很正确的生成孤立文件列表的命令。列表会出现在/tmp/orphaned-files :
    1. find / -xdev \( \( -path '/usr/portage' -o -path '/usr/local' -o -path '/tmp' -o -path '/dev' -o -path '/usr/src' -o -path '/home' -o -path '/lost+found' -o -path '/var/db' -o -path '/var/cache' -o -path '/var/log' -o -name '__pycache__' \) -prune -o -name '.keep' -o \( -type d -or -type f \) -print0 \) | xargs -0 qfile -o > /tmp/orphaned-files
    复制代码
  • 不幸的是,这个看起来正确的命令有严重的缺陷:emerge在记录某个软件包所安装的文件时,记录的是该软件make install时释放文件的路径。如果这个路径中某一级目录在真实的文件系统中是symbolic link的话,qfile -o不会对这个symbolic link进行解析,而是直接对比portage记录的原路径与您给出的路径。
    举个例子,在amd64架构下,Gentoo的/usr/lib是会链接到/usr/lib64的。如果某个软件包foo安装了一个/usr/lib/libfoo.so,emerge会记录:“软件包foo安装了/usr/lib/libfoo.so”,但实际上这个文件在/usr/lib64/libfoo.so。当您询问qfile /usr/lib/libfoo.so这个文件是否孤立时,qfile会告诉您它属于包foo;但如果您询问的是/usr/lib64/libfoo.so时,qfile会说这个文件是孤立文件,因为Portage没有关于/usr/lib64/libfoo.so的记录,尽管/usr/lib64/libfoo.so事实上是包foo安装的。
    这个缺陷导致的后果是,您会看到无数虚假的“孤立文件”,尤其是在amd64架构下。这个问题可以克服,但方法复杂,效率欠佳。
  • 第二个重要问题是,Portage安装包含python脚本的包时会对这些Python脚本进行“编译”。(尽管Python自身是解释性语言,但Python脚本可以被编译为二进制文件而提高执行速度。)编译生成的.pyc和.pyo文件不会被计入该包的内容。qfile因此会显示出大量的.pyo/.pyc“孤立文件”。(不过,这些文件在卸载对应包时的确会被清除。)
  • 第三个重要问题是,stage3本身包含了一些“孤立文件”,而且这些文件很可能不应该被删除。最典型的例子是"/bin/sh"。
  • 在这三种问题的影响下,上述命令会给出大量的虚假孤立文件,以至于真实的孤立文件夹杂于其间难以找到。

Post by easior lars;2159189
曾经也有过类似的问题,
自己不妨尝试用qfile -o 在/usr/share/目录试试,
或者搜索本版版友的相关帖子!

结论是:确实有残留文件!

在我这里,/usr/share/下用qfile可以检测出很多残留文件,但它们绝大多数不是真实的。

总结:我个人的意见是,Portage自身的管理功能足够完善,绝大多数包不会留下残余文件。除了在/etc下的配置文件,会因为Portage默认开启的config-protect功能被保留。少数包留下的残余文件基本是在这些程序运行时产生的,而由于Linux下大部分程序并不以root身份运行,残余文件多数存留于/home中,可以被用户轻易找到并删除。对一般用户而言,没有必要进行全盘的残余文件搜索或者为清理残余文件而重新安装系统,这是Windows带来的坏习惯。

如果您认为残余文件占用了大量磁盘空间,推荐使用ncdu查找具体原因。
回复 支持 反对

使用道具 举报

发表于 2012-1-27 22:35:51 | 显示全部楼层
也有楼主这样的疑问,

我只知道删除包时如果/etc下的配置文件有修改变动的话,这个配置文件是不会删除!
回复 支持 反对

使用道具 举报

发表于 2012-1-27 22:40:26 | 显示全部楼层
向5楼学习下!
回复 支持 反对

使用道具 举报

发表于 2012-1-27 23:56:40 | 显示全部楼层
向5楼学习!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-28 09:49:23 | 显示全部楼层
LS大神们。谢谢回答了。
回复 支持 反对

使用道具 举报

发表于 2012-1-28 10:28:47 | 显示全部楼层
小问题,大学问啊。
回复 支持 反对

使用道具 举报

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

本版积分规则

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