如何查找不属于任何存储库的所有文件?

时间:2014-09-02 05:01:50

标签: repository debian

在我的Debian系统中,我有不属于任何存储库的文件,它们是我的或者是使用'make install'安装的编译程序。如何查找不属于任何存储库的所有文件?

1 个答案:

答案 0 :(得分:0)

我假设文件不属于任何存储库,你的意思是

  

不属于系统上安装的软件包的文件

以下脚本将检查给定文件(完整路径)是否属于某个包,如果不是,则打印其名称(如果该文件属于pkg 不存在,则它将保留无声)。

#!/bin/sh

if [ -e "$1" ]; then
 dpkg -S "$1" >/dev/null 2>&1 || echo "$1"
fi

如果您将上述内容保存为(例如)/tmp/checkindeb并使其可执行,那么您可以运行

$ find / -type f -exec /tmp/checkindeb \{\} \;

它将打印系统中未由软件包安装的所有文件。

注意:上述测试非常慢。

您可以通过以下方式加快流程:

  • 排除/dev//sys/proc以及其他不包含任何真实(和/或永久)文件的伪文件系统中的所有文件。

  • 排除/usr/local/home/tmp以及其他众所周知的目录中的所有文件,包永远不会将文件安装到其中(特别是' / home`是臭名昭着的,因为它通常包含大量文件,并且所有文件都由用户拥有)

  • 排除网络共享上的所有文件(NFS,CIFS,...)

  • 生成所有软件包安装的所有文件的列表,并将其与计算机上安装的所有文件的列表进行比较。

类似以下内容:

#!/bin/sh
DEBFILES=$(mktemp)
ALLFILES=$(mktemp)

dpkg -L $(dpkg --get-selections | cut -f1) | while read f; do
  test -f "${f}" && echo "${f}"
done | sort -u > "${DEBFILES}"

find / \(                                                          \
      -wholename /home -o -wholename /tmp -o -wholename /usr/local \
      -o -wholename /sys -o -wholename /proc -o -wholename /dev    \
   \) -prune                                                       \
   -o -type f -print                                               \
| sort -u "${ALLFILES}"

diff "${DEBFILES}" "${ALLFILES}"

您可能必须以root身份运行该命令才能拥有列出所有文件的适当权限。