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

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

在我的系统中,我有不属于任何包的文件,它们是我的或来自随make install.如何找到不属于任何包的所有文件?

答案1

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

查找文件系统中与任何条目不匹配的所有文件可以通过如下简单的方法来实现:

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

这显然需要很长时间,因为将扫描整个文件系统。如果您对系统目录使用不同的分区(例如/usr/var),请在初始/.

警告:确实如此不是包含由包脚本创建的文件。例如:

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

答案2

更高效的版本@帕特里斯的解决方案,使用支持进程替换的 shell ( bash, AT&T ksh, zsh):

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

与帕特里斯的解决方案一样,它假设没有文件路径包含换行符。

答案3

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

答案4

您还可以使用进程替换 & 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)

相关内容