Debian 我的deb文件删除/opt

Debian 我的deb文件删除/opt,debian,dpkg,Debian,Dpkg,我的deb文件安装到/opt/myCompany/myProgram,当我用dpkg-p myProgram清除包时,所有内容都被删除-甚至/opt(如果我的包是唯一一个在/opt中包含文件的包)-如何避免在清除过程中删除/opt文件夹 我尝试检查postrm中是否存在/opt,如果不存在,则添加它,但没有乐趣…似乎在运行postrm脚本后该文件夹被删除。目前,我正在使用postinst在/opt中添加一个隐藏文件-这会阻止opt被删除,但感觉有点骇人-应该有更好的方法 谢谢你,这就是debia

我的deb文件安装到/opt/myCompany/myProgram,当我用dpkg-p myProgram清除包时,所有内容都被删除-甚至/opt(如果我的包是唯一一个在/opt中包含文件的包)-如何避免在清除过程中删除/opt文件夹

我尝试检查postrm中是否存在/opt,如果不存在,则添加它,但没有乐趣…似乎在运行postrm脚本后该文件夹被删除。目前,我正在使用postinst在/opt中添加一个隐藏文件-这会阻止opt被删除,但感觉有点骇人-应该有更好的方法


谢谢你,

这就是debian。每当它从非debian标准目录(如您的示例中的
/opt
)中删除包,并且该目录中没有文件时,
dpkg
将尝试删除该目录

如果在删除时
/opt
中还有其他文件,您将在“/opt不为空;未删除”行中收到一条消息,仅此而已


另一种“黑客”方式是添加重新创建的/opt-in
postrm
,但它并没有比你隐藏的文件更干净:)

这个问题几乎7年前就被问到了,但我在谷歌搜索类似问题时偶然发现了它,我想我还是会发布一个答案,因为问题的答案并不是真正的答案

以下问题也是相关的(但与/usr/local而不是/opt有关),可以类似地解决:

我使用以下技术解决了这个问题

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
  • 请注意,./opt/成员已被删除
最后一步是重新压缩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目录。

那么,如果其中没有文件,为什么要删除/opt?@umlaeute我想避免在使用dpkg-p删除myProgram时删除/opt文件夹。是的,我理解;然而,我想知道你为什么要这么做…也许你可以接受debian处理(空)/opt目录的方式…谢谢你的回答-你说-非debian标准目录(如/opt)-安装软件的debian标准目录是什么?由于找到信息,我正在使用/opt。而且,我确实尝试在postrm中重新创建/选择-但是删除发生在postrm运行之后。是的,FHS。。。FHS!=Debian;)Debian希望所有内容都位于/usr下