OSX에서 pkg 삭제하기

OSX에서 pkg 삭제하기

다음과 같은 좋은 script를 발견했다. 출처

사용법은

/uninstall.pl --find TeX 

과 같이 --find 뒤에 단어를 입력하면, 단어가 포함된 패키지를 찾아서 알려준다. 그러면

sudo ./uninstall.pl --pkg_id org.virtualbox.pkg.virtualboxcli 

와 같이 삭제를 하면 된다.

혹시 사이트가 사라지면 곤란하므로 복사해 놓는다.

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

GetOptions(
'pkg_id=s' => \my $pkg_id,
'debug' => \my $debug,
'find=s' => \my $find
);

my $home_dir = "/Users/" . $ENV{USER};

my $pkg_util = "/usr/sbin/pkgutil";

$pkg_id or $find or die "usage: $0 --pkg_id  [--debug] or $0 --find ";

sub finding_packages
{
    my $name = shift;
    print "\nFinding packages for $name\n\n";
    my $output = `$pkg_util --pkgs`;
    my @packages = $output =~ /^(.*$name.*)$/mig;
    foreach my $package (@packages) {
        print "Package: '$package'\n";
    }
}


sub installed_path
{
    my $pkg_id = shift;
    my $volume;
    my $path;
    my $output = `$pkg_util --pkg-info $pkg_id`;
    if ($output =~ /volume: (.*)\n/) {
        $volume = $1;
    }
    if ($output =~ /location: (.*)\n/) {
        if ($1 eq "(null)") {
            $path = "";
        } else {
            $path = $1;
        }
    }
    return ($volume . $path);
}

sub uninstall_files
{
    my $pkg_id = shift;
    my $path = installed_path($pkg_id);

    print "\nUninstalling files for $pkg_id from $path\n\n";
    my $output = `$pkg_util --only-files --files $pkg_id`;

    my @files = split(/\n/, $output);

    foreach my $file (@files) {
        my $full_path = $path . $file;

        if ($debug) {
            print "Deleted '$full_path'\n";
        } else {
            print "Deleted '$full_path'\n" if unlink($full_path);
        }
    }
}

sub delete_empty_dirs
{
    my $pkg_id = shift;
    my $path = installed_path($pkg_id);

    print "\nDeleting empty dirs for $pkg_id from $path\n\n";
    my $output = `$pkg_util --only-dir --files $pkg_id`;

    my @dirs = split(/\n/, $output);

    foreach my $dir (@dirs) {
        my $full_path = $path . $dir;
        if ($debug) {
            print "Deleted dir '$full_path'\n";
        } else {
            print "Deleted dir '$full_path'\n" if rmdir($full_path);
        }
    }
}


sub forget_pkg
{
    my $pkg_id = shift;
    my $output = `$pkg_util --forget $pkg_id`;
    print "$output\n";
}

if ($find) {
    finding_packages($find);
}

if ($pkg_id) {
    uninstall_files($pkg_id);
    delete_empty_dirs($pkg_id);
    forget_pkg($pkg_id) if (!$debug);
}

댓글