我已通过 安装了一个特定程序apt
。它源自第三方存储库,我 100% 确信该文件是通过apt
其他路径安装和更新的(根据我下面列出的数据)
我已经删除了特定的包名称,因为我想知道(A)我是否dpkg --search
正确理解了功能,以及(B)面对未知的文件dpkg
,我如何确切地找出它来自哪里?
$ which -a foobaz
/usr/bin/foobaz
/bin/foobaz
这些是不同的但相同的:
- 文件存在
- 既不是符号链接(
test -L $file
失败)也不是硬链接(stat -c %h -- $file
打印1
) - 有相同的
ctime
和mtime
- 请注意,该包最近已更新,所有时间对我来说看起来都是正确的。
- 具有相同的
sha1sum
哈希值
但 dpkg 似乎只知道第一个?
$ dpkg --get-selections | grep -i foobaz
foobaz install
$ dpkg-query -S /usr/bin/foobaz
foobaz: /usr/bin/foobaz
dpkg-query -S /bin/foobaz
dpkg-query: no path found matching pattern /bin/foobaz
不应该dpkg -S <file>
总是知道 debs/apt 添加的文件吗?当我知道某些“未知”文件的来源时,我应该如何处理这个问题来确定它们来自哪里充满信心它是用apt
?安装的。
答案1
dpkg
不会尝试解决link
s、bind
-mounts 或任何其他此类文件/inodes/目录的“重复视图”,即使在同一个文件系统中也是如此。解决所有此类情况会很困难(不可能?),尤其是在一般情况下(多个文件系统,因为许多安装都使用多个文件系统)。它也可能更接近 Unix 哲学“做好一件事”。
在某些系统(包括最近的 Ubuntu)上,/bin
是,这symlink
意味着/usr/bin
“搜索”的逻辑(例如which
)将看到两个副本,但使用静态 ~manifests 的逻辑(例如dpkg
)将只看到明确安装的文件。因为这是一个目录符号链接,它也是透明的/不能通过查看底层 inode 上的文件条目本身直接发现,必须检查所有父级。