在 Mac OS X 中卸载软件包

56
如何在Mac OS X中完全卸载(删除属于)某个软件包的文件?是否可以使用终端中的命令来完成?
我在我的Mac上安装了一个.pkg软件包,想知道如何卸载整个软件包,而不使用第三方应用程序,如UninstallPKG。
我想知道是否卸载.dmg文件也需要第三方应用程序,或者是否可以通过输入终端中的命令来卸载它们?

5
此问题似乎与编程无关,不属于该平台讨论范围。建议您前往http://apple.stackexchange.com寻求帮助。 - Droppy
2
具体来说,这个问题与http://superuser.com/questions/36567/how-do-i-uninstall-any-apple-pkg-package-file相同。我建议我们关闭这个问题,因为它不适合在StackOverflow上讨论。 - James McMahon
4个回答

39

在终端中使用此命令以检查软件包列表并卸载您的文件。

$ pkgutil --pkgs # list all installed packages

卸载文件后,您可以使用以下方式删除收据:

$ sudo pkgutil --forget the-package-name.pkg

在视觉检查文件列表后,您可以执行以下操作:

$ pkgutil --pkg-info the-package-name.pkg # check the location
$ cd / # assuming the package is rooted at /...
$ pkgutil --only-files --files the-package-name.pkg | tr '\n' '\0' | xargs -n 1 -0 sudo rm -i

注意最后一步。通过pkgutil --files输出的目录列表可能包括重要的共享目录,比如usr,你不应该删除它们。

$ pkgutil --only-dirs --files the-package-name.pkg | tr '\n' '\0' | xargs -n 1 -0 sudo rm -ir

这里复制(原始网页的Wayback Machine快照)


1
我尝试了上述命令来从一个软件包中删除文件,但它没有起作用。 rm -i 会提示用户进行确认,但由于 xargs(http://man7.org/linux/man-pages/man1/xargs.1.html)的 stdin 来自 /dev/null,因此您无法确认任何内容。您只会得到一系列的提示,而没有文件被删除。有其他人成功了吗? - LarsH
你如何卸载文件/如何知道哪些目录中的文件与特定软件包相关? - tedi
@LarsH 你需要使用 xargs -n 1 -0 sudo rm -if。这可能需要一些时间。 - Jorge Orpinel Pérez
@Jorge 谢谢。我后来弄明白了,可以看看我的回答。 - LarsH
如果您只是在最后一步中删除目录,为什么不使用sudo rmdir命令呢?这样它只会删除空目录。 - Victor Zamanian

32

我正在修改@karthikeyan的答案,但对我没有用。

在命令行中,使用以下命令查找所需软件包的名称:

$ pkgutil --pkgs | grep -i {keyword} | less

其中 {keyword} 是你期望在软件包名称中看到的字符串。

要查找软件包位置(所有文件列表将相对于其根目录),请使用

$ pkgutil --pkg-info package-name.pkg

使用此命令列出软件包的安装文件:

$ pkgutil --files package-name.pkg

视觉检查文件列表后,您可以执行以下操作来删除它们:

$ cd / # assuming the package location is /
$ pkgutil --only-files --files package-name.pkg | tr '\n' '\0' | xargs -n 1 -0 -p sudo rm

请注意下一个(最后)步骤,它将删除目录。由pkgutil --files输出的目录列表可能包括像usr这样的重要共享目录,您不想要删除它们。使用-p参数会导致xargs提示确认,但不要过于心急。 (使用rmdir也应该是安全的,因为它只会删除空目录。但某些人需要调整命令行,所以最好明确说明!)

$ pkgutil --only-dirs --files package-name.pkg | tr '\n' '\0' | xargs -n 1 -0 -p sudo rmdir

当您卸载文件后,可以删除该软件包的系统记录:

$ sudo pkgutil --forget package-name.pkg

来源: pkgutil man page这篇文章.


2
.pkg扩展名不是必需的,至少在pkg-info步骤中不需要。 - Jon L.
假设,如果信息步骤显示“位置:Applications/xxx.app”,并且“--files”步骤在“Contents/”之外没有显示任何内容,那么只需将应用程序拖到垃圾桶中就可以相当自信地确认所有文件都已删除了。 - Chris F Carroll
还有一个 pkgutil --unlink <package-id>,虽然没有记录。 - ՕլՁՅԿ
请参见 https://gist.github.com/githubutilities/b5318d08a4b970d104f1。(非常相似,更紧凑) - Jorge Orpinel Pérez
@Jorge,请解释一下你的编辑:为什么你认为在rm上使用-i比在xargs上使用-p更好? - LarsH
显示剩余3条评论

9
在OS X中,没有PKG卸载的概念。PKG/MPKG可以有一些与之相关的预安装和后安装脚本。PKG脚本中所做的事情始终取决于PKG创建者。作为一个外行人,我们无法去卸载一个PKG。
但是同时,有一些命令行可以对PKG文件进行完全的反向工程。它可以提取脚本和其他相关信息。下面给出的链接将为您提供一些信息。

http://s.sudre.free.fr/Stuff/Ivanhoe/FLAT.html http://www.mactech.com/articles/mactech/Vol.26/26.02/TheFlatPackage/index.html

在OS X上,有很少的卸载/清理应用程序可用。它们中的大多数会使用应用程序名称/pkg名称或捆绑标识符在已知目录(如/Library/Preferences、/Library/Application Support等)中进行搜索。这是一种进行完全删除的方法。
DMG不是安装程序文件。它们是磁盘映像文件。它可以包含.apps、pkg、mpkgs、其他文件等。安装的是DMG内部的安装程序。必须安装DMG以读取内容,并在完成后卸载。

http://osxdaily.com/2011/12/17/mount-a-dmg-from-the-command-line-in-mac-os-x/

此链接提供了如何挂载DMG的信息


0

如果你正在使用Brew,请列出所有已安装的软件包

brew list 

brew ls -lt(这个命令可以获取时间和日期)

brew uninstall <the-package-name> ( This will uninstall your package) 

如果你想要包括 brew 命令以外的所有包,请使用以下命令

pkgutil --pkgs 

在视觉检查文件列表后,您可以执行以下操作:

pkgutil --pkg-info the-package-name.pkg(检查位置) cd /(假设包根位于/...)

此命令将删除您的文件包 pkgutil --only-files --files the-package-name.pkg | tr '\n' '\0' | xargs -n 1 -0 sudo rm -f 此命令将删除您的目录 pkgutil --only-dirs --files the-package-name.pkg | tail -r | tr '\n' '\0' | xargs -n 1 -0 sudo rmdir


他们没有使用酿造。他们说这是一个.pkg文件。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接