这个问题是大约 7 年前提出的,但我在谷歌搜索类似问题时偶然发现了它,并认为无论如何我都会发布一个答案,因为这个问题的答案并不是真正的解决方案。
以下问题也是相关的(但与 /usr/local 而不是 /opt 相关)并且可以类似地解决:
dpkg:警告:删除目录时 /usr/local 不为空,因此未删除
我能够使用以下技术解决此问题。
Debian 软件包 (.deb) 只是一个包含 3 个成员的“ar”归档文件:
$ ar t package.deb
debian-binary
control.tar.gz
data.tar.xz
data.tar.xz 成员可能被命名为 data.tar.gz,具体取决于 *.deb 的年龄。相应地调整命令。
安装到目标系统的文件包含在 data.tar.xz 成员中。如果您提取 data.tar.xz 成员并列出其内容,您将看到例如以下内容。
$ ar p package.deb data.tar.xz | unzx -c | tar t
./
./opt/
./opt/myCompany/
./opt/myCompany/myProgram
从 data.tar.xz 文件中删除 ./opt/ 目录成员(但不是其内容)将阻止 dpkg 在卸载软件包时尝试删除 /opt 目录。
$ ar x package.deb data.tar.xz
$ unzx data.tar.xz
$ tar --delete --occurrence -f data.tar ./opt/
$ #tar --delete --occurrence -f data.tar ./usr/local/
现在,如果您列出 data.tar 文件的内容,您应该会看到如下内容:
$ tar tf data.tar
./
./opt/myCompany/
./opt/myCompany/myProgram
最后一步是重新压缩data.tar文件,将deb中的data.tar.xz成员替换为修改后的成员。
这是从 tar 文件存档中删除 ./opt/ 条目并将 deb 中的 tar 文件存档替换为修改后的完整过程的一个示例:
$ ar x package.deb data.tar.xz
$ unzx data.tar.xz
$ tar --delete --occurrence -f data.tar ./opt/
$ xz data.tar
$ ar r package.deb data.tar.xz
$ rm data.tar.xz
现在,当 deb 从系统中删除/卸载时,dpkg 将不会尝试删除 /opt 目录。