许多文件都是通过我的文件系统上的包安装的。
- 我怎样才能列出不是? 即用户创建,比如手动编译软件、编写文档。
- 有没有办法列出来自软件包但已更改的文件?检查我修改了什么。
对于我更新内部使用的定制图像的项目来说,这很有用。另外,当我在家里重新安装时,我忘记了我做了什么。当然,最有趣的是在主目录之外,但例如,主目录中的点配置文件的更改也很有趣。
答案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
使用前请注意以下事项:
如果您只关心配置文件的更改,请替换
-a
为-e
并添加-not -name "*~"
。 (这明显更快。)-type f
sudo
根据需要添加。