# 解除安裝用 .pkg 套件安裝的 Mac App

> .pkg 安裝程式會在 App 之外留下收據和檔案。用 pkgutil 讀收據，只移除屬於這個產品的東西，最後才忘掉收據。

Published: 2026-09-06 | Updated: 2026-09-26

用 `.pkg` 安裝程式裝上的 App，和從磁碟映像檔拖出來的 App 不是同一回事。安裝程式是以 root 身分執行的，套件叫它寫到哪裡，它就能寫到哪裡，裝完還會在「安裝程式」的收據資料庫裡記下裝了什麼。把 App 拖到垃圾桶，只是從這份記錄裡拿走一個資料夾，其餘的東西連同記錄本身都還在。這篇講的就是這種情況，怎麼確認 App 是套件裝的、怎麼看它在磁碟上放了什麼、哪些該移除、哪些該留著。如果 Finder 直接拒絕，或 App 刪了又自己回來，請先看 [Mac App 無法解除安裝：七種常見原因與排查方法](https://mole.fit/tw/blog/mac-app-wont-uninstall)，自己拖進來的 App，走[完整的解除安裝指南](https://mole.fit/tw/blog/how-to-completely-uninstall-apps-on-mac)裡的一般流程就好。

## 為什麼垃圾桶不夠

套件可以把檔案放在 App 旁邊，不只是 App 裡面。我用官方安裝程式重新裝過一批 App 再移除，Zoom 的官方套件在 `zoom.us.app` 之外留下三個 launchd 工作和一個特權輔助程式 `us.zoom.ZoomDaemon`。Logi Options+ 的安裝程式還裝了另一個產品 LogiRightSight，帶著自己的收據和自己的啟動代理程式。DisplayLink Manager 在 `/Library/LaunchAgents` 裡加了一個啟動代理程式。Microsoft Office 會安裝一個 Word、Excel 和 PowerPoint 都會載入的共用框架套件，Microsoft AutoUpdate 和一個授權輔助程式也會跟著裝上。這些都不會跟著 App 套件一起移走。

收據也不會移走。它存在「安裝程式」自己的資料庫裡，和它描述的那些檔案是分開的，所以移除 App 之後，`pkgutil` 仍然回報這個套件還裝著。DisplayLink 的官方解除安裝程式乾乾淨淨跑完一遍，它的兩份收據還在。

Finder 跳出密碼提示，是另一個代表你碰到套件的跡象。安裝程式以 root 身分執行，所以它留下的 App 套件屬於 root，移動它需要認證。這很正常，[解除安裝排查指南](https://mole.fit/tw/blog/mac-app-wont-uninstall)裡有說明。

## 確認是不是套件裝的

先看收據列表和 App 自己的路徑：

```sh
pkgutil --pkgs | grep -i zoom
pkgutil --file-info /Applications/zoom.us.app
```

`pkgutil --pkgs` 會列出「安裝程式」在啟動磁碟上記錄過的每個套件 ID。搜尋時用廠商名稱和產品名稱，不要只搜 App 的 bundle 識別碼，因為兩者經常毫無關係。Zoom 的 App 是 `us.zoom.xos`，收據卻是 `us.zoom.pkg.videomeeting`，安裝 Cookie.app 的收據是 `app.fantasticthing.Bookkeeping`。連大小寫都可能不同，愛思助手的 bundle 識別碼是 `cn.i4Tools.mac`，收據是 `cn.i4tools.mac`，而 `pkgutil` 是按 ID 精確比對的，用大小寫混寫的那個去查，它會回答「No receipt」，收據其實就在那裡。所以 ID 要從 `--pkgs` 的輸出複製，不要自己打。

`pkgutil --file-info` 照理會在路徑底下用 `pkgid:` 行標出是哪個套件安裝了它，但沒有答案不代表「不是套件裝的」。我在 macOS 27 上發現，對大多數路徑它只會印出 `volume` 和 `path`，不管檔案已經刪除還是還在，DisplayLink Manager 的 App 就拿到這樣的空答案，而它的兩份收據明明還在 Mac 上。有收據也不代表你親手執行過 `.pkg`，Mac App Store 也會替某些 App 留下一份，例如 `com.apple.pkg.TestFlight`。

## 收據記錄了什麼

用兩個指令看一個套件裝了什麼、裝在哪裡：

```sh
pkgutil --pkg-info us.zoom.pkg.videomeeting
pkgutil --files us.zoom.pkg.videomeeting
```

`--pkg-info` 會印出套件 ID、版本、`volume`、`location` 和安裝時間。`--files` 印出的路徑是相對於那個卷宗和位置的，所以真正的路徑要把三段接起來。位置是 `Applications` 的收據，列出的是 `Foo.app/Contents/...`，位置為空的收據，列出的則是 `Applications/Foo.app/...`。先看位置再看列表，不然查的每一條路徑都會錯。

列表裡除了檔案也有目錄。`--only-files` 和 `--only-dirs` 可以把兩者分開，一旦看到收據可能把 `Library` 和 `Library/LaunchAgents` 本身也列進去，就知道這很有用。原始記錄放在 `/private/var/db/receipts`，每個套件一個 `.bom` 和一個 `.plist`，但 `pkgutil` 的使用手冊寫明收據檔案的位置可能會變，一律要透過 `pkgutil` 查詢。

## 收據是地圖，不是刪除清單

很容易想把 `pkgutil --files` 的輸出丟進迴圈，全部刪掉。按套件解除安裝會把別的東西弄壞，多半就是這麼來的。這份列表說的是這個套件寫入了什麼，不是只有這個套件在用什麼：

| 列表裡有什麼 | 為什麼不能直接刪 |
| --- | --- |
| `Applications`、`Library`、`Library/LaunchAgents` 這類目錄 | 套件建立或動過它們，但 Mac 上其他所有 App 也都在用 |
| 廠商在多個 App 之間共用的框架和輔助程式 | Word、Excel 和 PowerPoint 都會載入 Office 的共用框架，少了它們一打開就當掉 |
| 幾個 App 共用的內容 | GarageBand、Logic Pro、MainStage 和 Final Cut Pro 共用 `/Library/Application Support/GarageBand`、`/Library/Application Support/Logic` 和 `/Library/Audio/Apple Loops`，記錄在 `com.apple.pkg.MAContent10_*` 這批收據底下 |
| 同一個安裝程式順便帶進來的另一個產品 | LogiRightSight 跟著 Logi Options+ 一起裝進來，自己也能單獨運作 |
| 啟動代理程式和守護程式的 plist | 已載入的工作要先停止，再移走它的 plist，不然 launchd 會留著一個磁碟上已經什麼都沒有的工作 |

這份列表也有漏掉的東西。它記錄的是套件的內容物放到磁碟上的東西，而安裝腳本能做的更多，套件裡也確實帶著腳本，例如 Foxit 的套件就有 postinstall 腳本和一個更新服務。App 執行之後還會在你的個人資源庫底下寫入自己的資料，這些都不在任何收據裡。這一側請看[解除安裝 Mac App 後，如何清理殘留檔案](https://mole.fit/tw/blog/how-to-remove-leftover-files-after-uninstalling-mac-apps)。

## 先用廠商的解除安裝程式

Apple 的[刪除 App 說明](https://support.apple.com/102610)講得很直接，如果 App 附有解除安裝程式，「這是刪除該 App 以及它可能儲存在其他位置的登入項目、延伸功能或其他資料的最佳方式」。用套件安裝的軟體常常附一個，因為廠商知道自己的腳本、輔助程式和共用部分在哪裡。可以到套件所在的磁碟映像檔、「應用程式」裡這個 App 的資料夾、`/Applications/Utilities`、App 自己的選單，以及廠商的支援網站找找。像 Splashtop Personal 就把解除安裝程式和套件放在同一個磁碟映像檔裡。

如果已經把 App 拖到垃圾桶，用「**檔案 › 放回原處**」把它拿回來，打開它，從裡面執行解除安裝程式。安全軟體、VPN 用戶端和驅動程式這幾類，廠商的工具不是可有可無，延伸功能和網路過濾器只能透過擁有它們的 App 移除，這部分在[怎麼在 Mac 上解除安裝防毒軟體又不弄壞網路](https://mole.fit/tw/blog/how-to-uninstall-antivirus-mac)裡有說明。

## 手動移除

沒有解除安裝程式時，收據會告訴你去哪裡找。照這個順序處理：

1. 結束 App，以及它在背景執行的所有東西。
2. 用 `--pkg-info` 看位置，再用 `--files` 看列表，把 App 套件以外的路徑記下來。
3. 列表裡的每個啟動代理程式或守護程式，先用 `launchctl bootout` 解除載入工作，再移動它的 plist。[排查指南裡 launchd 那一節](https://mole.fit/tw/blog/mac-app-wont-uninstall)說明了為什麼順序很重要。
4. 只把明確屬於這個產品的東西移到垃圾桶，包括 App 套件、以它的 bundle 識別碼或產品名稱命名的資料夾和 plist、`/Library/PrivilegedHelperTools` 裡它的輔助程式。共用的上層資料夾，以及廠商其他 App 還在用的東西都留著。`pkgutil --pkgs | grep -i vendorname` 可以看出同一個廠商是否還有其他套件裝著，如果有，它們的共用框架就要留下。
5. 最後才忘掉收據，前提是它列出的東西都已經不在了：

```sh
sudo pkgutil --forget com.vendor.pkg
```

`--forget` 會丟掉收據，用使用手冊的話說，它「不會動到已安裝的檔案」。先執行它，檔案會全部留在原處，卻再也沒有記錄指向它們，接下來的工作只會更難。它需要 `sudo`，因為 `/private/var/db/receipts` 屬於 root，而且 ID 要和 `--pkgs` 的拼寫完全一樣。過時的收據裡沒有任何使用者資料，所以如果拿不準它列出的東西還有沒有在用，留著收據也沒有任何代價。

## 檢查結果

下面這些指令只讀取。把 `com.vendor.pkg` 和 `vendorname` 換成你在上面查到的值：

```sh
id=com.vendor.pkg
loc=$(pkgutil --pkg-info "$id" | sed -n 's/^location: //p')
pkgutil --files "$id" --only-files | while IFS= read -r f; do
  p="/${loc:+$loc/}$f"
  [ -e "$p" ] && echo "$p"
done
pkgutil --pkgs | grep -i vendorname
ls /Library/LaunchAgents /Library/LaunchDaemons /Library/PrivilegedHelperTools | grep -i vendorname
launchctl list | grep -i vendorname
launchctl print system | grep -i vendorname
```

那個迴圈會把收據裡仍然存在的每個檔案連同完整路徑印出來。沒有輸出，代表內容物已經全部不在，可以放心忘掉收據。輸出落在 App 套件裡，代表 App 還裝著，落在其他地方的，就是移除時漏掉的，或是你因為其他 App 共用而決定留下的。如果 `pkgutil` 回答「No receipt for ... found」，代表收據已經忘掉了，或 ID 拼法不同。`ls` 和 `launchctl` 那幾行用來抓收據從來沒列過的輔助程式。`launchctl list` 看的是你自己的啟動代理程式，`launchctl print system` 看的是守護程式，只要印出一行就代表工作還載入著，第一欄是非零數字的正在執行。

## Mole 怎麼處理套件安裝的 App

在 [Mole](https://mole.fit/tw/) 裡移除一個 App 時，它會讀取名稱和這個 App 的 bundle 識別碼或產品名稱相符的收據，列出其中仍然存在的路徑，但只限一個很窄的範圍，也就是「應用程式」裡的 App 套件，以及 `/Library` 底下以這個 bundle 識別碼精確命名的 Application Support、Caches、Logs、PrivilegedHelperTools、WebKit 和 HTTPStorages 資料夾，再加上 Preferences、LaunchAgents 和 LaunchDaemons 的 plist。這些列預設都不勾選，你讀過之後再一個一個勾。`/Users`、`/opt`、`/usr` 和 `/private` 底下的路徑，永遠不會因為收據變成一列，收據檔案本身也不會。

App 移除之後，Mole 會用 `pkgutil` 在磁碟上的拼法，忘掉以它的 bundle 識別碼命名的收據，也會忘掉透過 `pkgutil --file-info` 找到的廠商收據，後者只有在那份收據列出的檔案一個都不存在時才會忘掉。這一步只在管理者輔助程式已經為這次移除取得授權時才做，所以它從不會為了一份收據多跳一次密碼提示。查找廠商收據時，會略過 Apple 的 `com.apple.*` 收據。

限制就是上面說的那個。因為 `pkgutil --file-info` 在 macOS 27 上很少給出答案，ID 和 App 毫無關係的收據，在 Mole 移除 App 之後可能還會留著，DisplayLink 的兩份和 Zoom 的那份都是這樣。它們只是記錄，`sudo pkgutil --forget` 就能清掉。驅動程式、VPN 用戶端和安全軟體這幾類，Mole 不能取代廠商的解除安裝程式。

## 常見問題

### pkgutil --forget 會解除安裝 App 嗎？

不會。使用手冊寫明，它會丟掉這個套件的所有收據資料，但不會動到已安裝的檔案。要在檔案都移除之後再執行，絕對不能拿它代替移除檔案。

### pkgutil --files 列出的檔案可以全部刪掉嗎？

不行。列表裡有 `Library` 和 `Applications` 這類系統目錄、廠商其他 App 會載入的框架，以及可能仍在執行的工作的 plist。用它找出要檢查的東西，再移除只屬於這個產品的部分。

### App 已經不在了，pkgutil --pkgs 卻還列著它，是不是還裝著？

不一定。刪除檔案從來不會更新收據，所以收據會一直留到有人把它忘掉。跑一次上面的檢查迴圈，如果收據列出的東西都不在了，剩下的就只是記錄，`sudo pkgutil --forget` 就能把它移除。

---

Canonical HTML page: https://mole.fit/tw/blog/how-to-uninstall-pkg-apps-mac
Blog index for agents: https://mole.fit/tw/blog/llms.txt
Site index for agents: https://mole.fit/llms.txt
