Как удалить любой пакетный файл PKG Apple/macOS?

Вопрос или проблема

Несмотря на мнение, противоположное, не все пакеты устанавливаются чисто в одной директории. Есть ли способ обратить процесс установки файла PKG, желательно с оригинального пакета (или из репозитория информации об установленных пакетах)?

В частности, я установил пакет MySQL 5.4.1 для PowerPC на Intel MacBook и хотел бы аккуратно его отменить, восстановив установку 5.1 x86, которую я вижу, но она сейчас не работает должным образом.

Этот блог-пост описывает, как удалить .pkg с помощью встроенного pkgutil.

Измененный фрагмент

$ pkgutil --pkgs # список всех установленных пакетов
$ pkgutil --files имя-пакета.pkg # список установленных файлов

После визуальной проверки списка файлов вы можете сделать что-то вроде:

$ pkgutil --pkg-info имя-пакета.pkg # проверить местоположение
$ cd / # предполагая, что пакет коренится в /...
$ pkgutil --only-files --files имя-пакета.pkg | tr '\n' '\0' | xargs -n 1 -0 sudo rm -f
$ pkgutil --only-dirs --files имя-пакета.pkg | tail -r | tr '\n' '\0' | xargs -n 1 -0 sudo rmdir

Не нужно и говорить, что следует проявлять крайние осторожности при удалении файлов с правами администратора. В частности, будьте внимательны, что некоторые пакеты могут обновлять общие системные компоненты, поэтому их удаление может на самом деле сломать вашу систему, убрав необходимый компонент.

Для более мелких пакетов, вероятно, безопаснее просто вручную удалить файлы после визуальной проверки списка файлов пакета.

Согласно имеющимся данным, когда-то была опция --unlink в pkgutil, но начиная с Lion она не упоминается в справочной странице. Возможно, она была удалена, так как была признана слишком опасной.

Как только вы удалите файлы, вы можете удалить счет-фактуру с помощью:

$ sudo pkgutil --forget имя-пакета.pkg

Встроенная в систему функция удаления файлов через деинсталлятор отсутствует, поэтому вы можете либо создать деинсталлятор самостоятельно, либо удалить файлы вручную.

Лучший способ определить, какие файлы были установлены, – это получить оригинальный .pkg, если это возможно. Если это невозможно, вы можете также использовать счета-фактуры, найденные в /Library/Receipts. Ваша самая большая проблема возникает, когда вы имеете дело с .mpkg, который содержит несколько .pkg файлов, поскольку тогда вам придется найти все отдельные .pkg файлы в этой папке (к счастью, это не так уж и сложно, если сортировать по дате).

Как только у вас есть файл .pkg (счет-фактура или полный файл установки), вы можете использовать утилиту, чтобы либо создать деинсталлятор, либо найти файлы, чтобы вы могли удалить их вручную:

Деинсталлятор

Absolute Software InstallEase – бесплатная программа, которая может создавать деинсталляторы из существующих .pkg файлов. Создайте файл деинсталлятора .pkg (замечание: вам потребуются инструменты разработчика Apple, чтобы действительно создать файл .pkg)

Вручную

Используя программу, такую как Pacifist, или плагин QuickLook, такой как Suspicious Package, вы можете увидеть, какие файлы установлены и в каком месте. Используя этот список, вы можете вручную перейти к этим папкам и удалить файлы. Я использовал этот метод много раз, прежде чем обнаружил InstallEase, но это все еще часто быстрее, если установка не распределена по многим местам.

Вы также можете удалить пакеты .pkg с помощью UninstallPKG.

Полное раскрытие информации: Да, я автор.

Я сделал сценарий на оболочке

вы можете попробовать его

https://github.com/iamrToday/pkg-remove

Он показывает демонстрацию в формате .gif, вы можете увидеть исходный код, просто оберните командную строку brablc. Вы можете запустить его, чтобы искать информацию, вы также можете удалить apk. Он интерактивный.

Вы можете попробовать предложения с этого сайта. Также есть статья по этому вопросу на сайте поддержки Adobe.

Кроме того, приложения, которые обычно имеют файл PKG в DMG, обычно имеют и другой пакет, используемый для удаления. Я не уверен, актуально ли это здесь, но хотел сообщить вам, чтобы сохранить оригинальный dmg файл.

Я написал скрипт на Python лишь для этого. Репозиторий на GitHub можно найти здесь.

#!/usr/bin/env python3

# запустите его с `sudo`

from pathlib import Path
import sys
import typing as T
import os
import subprocess

def main():
    pkgs = list_pkgs(sys.argv[1])
    for i, pkg in enumerate(pkgs):
        print(f"{i}: {pkg}")
    idx = input("Выберите пакет для удаления ")
    pkg = pkgs[int(idx)]
    print(f"Удаление {pkg}")
    uninstall(pkg)

def uninstall(pkg: str):
    to_remove = []
    for file in subprocess.run(
        ["pkgutil", "--only-files", "--files", pkg], text=True, capture_output=True
    ).stdout.split("\n"):
        if not file.strip():
            continue
        p = Path(f"/{file}")
        # assert p.is_file(), f"{p} не является файлом"
        to_remove.append((p, False))
    for d in subprocess.run(
        ["pkgutil", "--only-dir", "--files", pkg], text=True, capture_output=True
    ).stdout.split("\n"):
        if not d.strip():
            continue
        p = Path(f"/{d}")
        # assert p.is_dir(), f"{p} не является директорией"
        to_remove.append((p, True))

    for path, is_dir in to_remove:
        try:
            if not is_dir:
                path.unlink()
            else:
                path.rmdir()
        except Exception:
            pass

    subprocess.run(["sudo", "pkgutil", "--forget", pkg], text=True)

def list_pkgs(keyword) -> T.List[str]:
    pkgs = subprocess.run(
        ["pkgutil", "--pkgs"], text=True, capture_output=True
    ).stdout.split("\n")
    return [p for p in pkgs if keyword.lower() in p.lower()]

if __name__ == "__main__":
    main()

Для тех, кто имеет Parallels, вы найдете инструмент под названием “Удалить приложения” (Désinstaller des applis по-французски), предоставленный в их пакете инструментов

Ответ или решение

Как удалить пакет PKG на macOS: Полное руководство

Удаление пакетов, установленных с помощью файлов .pkg на macOS, может быть сложной задачей, особенно когда речь идет о пакетах, которые не имеют встроенного средства удаления. В этой статье мы рассмотрим различные способы удаления пакетов .pkg, описанные на основе технической информации и пользовательского опыта. Следуйте этому руководству, чтобы грамотно удалить нужные вам пакеты и избежать проблем в будущем.

Шаг 1. Определение установленных пакетов

Первоначально вам необходимо выяснить, какие пакеты были установлены на вашем компьютере. Для этого вы можете использовать команду pkgutil в терминале:

pkgutil --pkgs  # Список всех установленных пакетов

Эта команда выдаст список всех установленных пакетов на вашем Mac. Обратите внимание на название пакета, который вы хотите удалить.

Шаг 2. Выявление файлов и директорий пакета

После того как вы узнали название пакета, следующим шагом будет определение файлов и директорий, установленных этим пакетом. Воспользуйтесь следующими командами:

pkgutil --files the-package-name.pkg  # Список установленных файлов
pkgutil --pkg-info the-package-name.pkg  # Информация о пакете, включая его местоположение

Шаг 3. Удаление файлов и директорий

Теперь вы готовы к удалению файлов и директорий, установленных пакетом. Используйте следующие команды, чтобы выполнить удаление:

# Удаление файлов
sudo pkgutil --only-files --files the-package-name.pkg | tr '\n' '\0' | xargs -n 1 -0 sudo rm -f

# Удаление директорий
sudo pkgutil --only-dirs --files the-package-name.pkg | tail -r | tr '\n' '\0' | xargs -n 1 -0 sudo rmdir

Важно! Будьте очень осторожны, удаляя файлы с правами суперпользователя, так как это может повредить систему, если удалить критически важные компоненты.

Шаг 4. Удаление информации о пакете

После удаления файлов и директорий очень важно удалить запись о пакете, чтобы система больше не считала его установленным:

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

Дополнительные инструменты для удаления

Если командная строка вам не подходит, вы можете использовать специальные приложения для удаления пакетов:

  • InstallEase – бесплатная программа для создания средств удаления из существующих .pkg файлов.
  • Pacifist – позволяет просматривать содержимое .pkg файлов и модифицировать установки.
  • Suspicious Package – QuickLook плагин для просмотра установленных файлов и их местоположений.
  • UninstallPKG – еще одно решение, разработанное для простоты удаления пакетов.

Создание собственного скрипта

Для тех, кто предпочитает автоматизацию, можно создать свой собственный скрипт для удаления пакетов. Вот пример Python скрипта, который вы можете настроить под свои нужды:

#!/usr/bin/env python3

from pathlib import Path
import subprocess
import sys

def uninstall(pkg_name):
    # Получить файлы пакета
    files = subprocess.run(["pkgutil", "--only-files", "--files", pkg_name], capture_output=True, text=True).stdout.splitlines()
    for f in files:
        try:
            Path(f).unlink()
        except Exception as e:
            print(f"Ошибка при удалении {f}: {e}")

    # Удалить запись о пакете
    subprocess.run(["sudo", "pkgutil", "--forget", pkg_name])

if __name__ == "__main__":
    pkg_name = sys.argv[1]
    uninstall(pkg_name)

Запустите скрипт с правами суперпользователя и укажите имя пакета, который необходимо удалить.

Заключение

Удаление пакетов .pkg на macOS может быть как простой, так и сложной задачей, в зависимости от характеристик установленных компонентов. Следуя вышеописанным шагам, вы сможете эффективно управлять установленными пакетами и минимизировать риски для вашей системы. Если вы столкнулись с трудностями, всегда полезно иметь под рукой оригинальные .pkg файлы или использовать специализированные утилиты, которые облегчат процесс удаления.

Оцените материал
Добавить комментарий

Капча загружается...