如何查找不属于任何程序包的文件?


12

在我的系统中,我有不属于任何软件包的文件,这些文件是我的,或者来自安装了的编译程序make install。如何找到不属于任何程序包的所有文件?

Answers:


10

其中/var/lib/dpkg/info.list文本文件列出了通过Debian的软件包管理器安装的每个软件包¹中包含的所有文件。

在文件系统中查找与任何条目都不匹配的所有文件都可以通过这样的简单操作来实现:

find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)

显然,这将花费很长时间,因为将扫描整个文件系统。如果您对系统目录使用不同的分区(例如/usr/var),请在initial之后指定它们/

警告:这并没有包括由包脚本创建的文件。例如:

  • /etc/hosts.allow没有在任何地方列出,但是libwrap0如果在安装软件包时该文件不存在,则它可能来自创建该文件的地方。
  • 在安装过程中会编译许多文件,例如.pyc文件(已编译的Python库),.elc文件(已编译的Emacs Lisp librarires)等。

错误find: argument list too long
naught101 '18

@ naught101这表明存在大量匹配的文件/var/lib/dpkg/info/*.list-以上查询将需要根据其他原则进行重写。
Patrice Levesque '18年

6

@Patrice解决方案的更有效版本,使用支持进程替换的外壳程序(bash,AT&T kshzsh):

(
  export LC_ALL=C
  comm -23 <(find / -xdev -type f | sort) \
           <(sort -u /var/lib/dpkg/info/*.list)
)

像Patrice的解决方案一样,它假定没有文件路径包含换行符。


1
使用locate数据库比运行数据库快find吗?locate \* | grep -v "^/home/"-还具有查看/boot/和其他系统分区的优势。
naught101 '18

3

由于标记了您的问题,debian因此,cruft-ng如果您不需要任何灵活性,或者cruft您不想搜索整个系统/所定位的b,则可以使用尚未提及的明显选择。


0

您还可以使用流程替换grep&&find。请注意,如果您要在某个目录中查找文件,grep则两次使用来仅过滤相关路径,/var/lib/dpkg/info以节省几秒钟的时间。

dir="/lib/x86_64-linux-gnu"
find "$dir" -type f \
| grep -v -x -F -f \
    <(find '/var/lib/dpkg/info' -name '*.list' -print0 \
       | xargs -0 grep -h -F "^$dir" \
       | sort -u)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.