列出非来自软件包的文件

列出非来自软件包的文件

许多文件都是通过我的文件系统上的包安装的。

  • 我怎样才能列出不是? 即用户创建,比如手动编译软件、编写文档。
  • 有没有办法列出来自软件包但已更改的文件?检查我修改了什么。

对于我更新内部使用的定制图像的项目来说,这很有用。另外,当我在家里重新安装时,我忘记了我做了什么。当然,最有趣的是在主目录之外,但例如,主目录中的点配置文件的更改也很有趣。

答案1

从字面上回答您的问题,您可以用这种方式列出不来自包的文件:

find / -xdev -type f | sort >/tmp/root.files
sort /var/lib/dpkg/info/*.list >/tmp/installed.files
comm -23 /tmp/root.files /tmp/installed.files

这当然会包括主目录下的所有文件。您可以find通过添加-prune指令跳过命令中的某些目录(您还需要添加-print以打印其余目录,因为-print只有在没有操作时才会暗示该操作)。

find / -xdev -type f -path /home -prune -o -path /var -prune -o -print | sort >/tmp/root.files

要检查文件是否已更改,您可以将其校验和与 中的校验和进行比较/var/lib/dpkg/info/$PACKAGE.md5sum。如果您想比较每个文件(这将花费很长时间):

for p in /var/lib/dpkg/info/*.list; do
  diff <(md5sum $(cat $p) | sort) <(sort ${p#.list}.md5sums);
done

你不需要这样做,因为你不应该修改来自软件包的文件。你也不应该在系统目录中添加自己的文件。

如果您修改了配置文件,它位于 中/etc;这是您应该修改系统文件的唯一位置。安装etckeeper包来跟踪你的修改/etc。运行sudo etckeeper init/etc并将受到版本控制(市场默认情况下)。

如果您要安装系统范围内的软件,请将其安装在 下/usr/local。不要触碰/bin/sbin、中的任何内容/lib(除非您手动安装内核模块,因为您的硬件不常见),或/usr(除非/usr/local您自己使用)。

主目录中的所有文件都是由您创建的(除了少数文件是从/etc/skel您创建帐户时复制的)。没有通用的方法来跟踪哪些是应用程序默认值,哪些是您选择配置选项的结果,哪些记录了当前状态(打开的文件、命令历史记录等)。

答案2

对于您的第二点,您可以使用debsums -ac(来自同名的包)列出所有已被修改的包文件(包括配置文件)。

答案3

把其他答案放在一起,这里有一个脚本,列出了所有不来自任何已安装软件包的文件,然后是所有已更改的配置文件。

{ \
    find "${PREFIX-}/" -xdev -type f && \
    echo "" && \
    cat -- "${PREFIX}"/var/lib/dpkg/info/*.list; \
} | awk '
    done { --seen[$0]; }
    /^$/ { done = 1; }
    !done { files[++n] = $0; ++seen[$0]; }
    END { for (i = 1; i <= n; ++i) { if (seen[files[i]] > 0) { print(files[i]); } } }
' && debsums --admindir="${PREFIX-}"/var/lib/dpkg -a -c 2> /dev/null

使用前请注意以下事项:

  1. 如果您只关心配置文件的更改,请替换-a-e并添加-not -name "*~"。 (这明显更快。)-type f

  2. sudo根据需要添加。

相关内容