Une manière infaillible d’extraire des fichiers .pkg

1

Je sais qu'il existe des outils d'interface graphique payants qui vous permettent de le faire, mais ceux-ci ne m'intéressent pas.

Actuellement, je fais ceci:

gzcat Contents/Archive.pax.gz | pax -r

Cependant, certains fichiers pkg sont maintenant des archives xar et j'ai besoin de pkgutil pour les extraire. Et il y a probablement d'autres permutations de pkg spec dont je ne suis pas au courant.

En bout de ligne, je peux toujours trouver un moyen d'extraire manuellement les éléments du paquet, mais j'aimerais une solution unique qui le ferait automatiquement sans se soucier de la mise en œuvre spécifique de pkg, par exemple:

unpkg CrappyPackage.pkg

Est-ce qu'une telle chose existe?

Le moyen le plus sûr est peut-être d'utiliser le programme d'installation du système lui-même, mais cela semble toujours nécessiter un lecteur système complet comme cible. Serait vraiment utile si vous pouviez faire quelque chose comme:

installer -pkg CrappyPackage.pkg -target SomeEmptySandbox.dmg

Je sais qu'il existe cette question: Comment puis-je ouvrir un fichier .pkg manuellement? Cependant, toutes les solutions proposées sont assez manuelles et je les fais tout de même.

kLy
la source
1
Que voudriez-vous faire si le fichier est une archive 'xar'?
TJ Luoma
pkgutil --expand thepackage.pkg destination
kLy
ouxar -xf package.pkg
kLy

Réponses:

4

Il est assez facile de créer un script shell qui vérifie quelques conditions et prend ensuite les mesures appropriées.

J'ai mis le mien à http://dl.dropbox.com/u/18414/bin/unpkg.sh mais je copierai la version initiale ci-dessous:

#!/bin/zsh
#
#   Author:     Timothy J. Luoma
#   Email:      luomat at gmail dot com
#   Date:       2011-12-29
#
#   Purpose:    extract .pkg files, either xar archives or directory
#               
#   URL:       http://dl.dropbox.com/u/18414/bin/unpkg.sh
#   
#   See also:  http://apple.stackexchange.com/questions/34957/foolproof-way-of-extracting-pkg-files

NAME="$0:t"

    # Brief explanation of how program works
USAGE="$NAME is meant to extract package files. (Filenames must end in .pkg). Can handle both .pkg directories or xar archives.

Usage: $NAME /path/to/foo.pkg
"

    # in case of emergency, report error and exit
die ()
{
    echo "$NAME: $@"
    exit 1
}

    # if not given any input, explain how to use it
if [ "$#" = "0" ]
then
        die "$USAGE"    
fi

    # put whatever we get as an argument into a variable
INPUT="$@"

    # does the input actual refer to an existing file?
    # if not, exit
[[ -e "$INPUT" ]]       || die "$INPUT does not exist"

    # get the extension of the input. i.e. if we are
    # given "foo.pkg" this will just be "pkg"
EXT="$INPUT:e"

    # check to make sure that the extension is 'pkg'
    # because that's what we're looking for
[[ "$EXT" = "pkg" ]]    || die "$INPUT is not a pkg"

TYPE=`file -b "$INPUT"`

case "$TYPE" in 
    directory)
                gzcat "$INPUT/Contents/Archive.pax.gz" | pax -r

    ;;

    "xar archive - version 1")
                # Put whatever commands you want here
                :
    ;;


    *)
            die "$USAGE"    
    ;;

esac



exit 0
#EOF

zsh est maintenant inclus dans Mac OS X depuis plusieurs versions. Je préfère cela à / bin / sh parce que… eh bien, n'entrons pas dans une guerre «ma coquille vaut mieux que votre coquille», car ma coquille gagnerait :-)

Quoi qu'il en soit, zsh rend les choses un peu plus faciles et plus agréables, et c'est inclus, il n'y a donc aucune raison de ne pas l'utiliser, IMO. Surtout pour un script spécifique à OS X comme celui-ci.

Cela a été testé sur 10.7.

TJ Luoma
la source
Exactement le genre de chose dont nous avons besoin :) N'y a-t-il pas encore été créé de la sorte sur github? La seule chose à faire est qu'il peut y avoir d'autres permutations de fichiers .pkg qui ne sont pas couvertes dans les exemples ci-dessus, mais c'est un bon début. Aurait besoin de quelques cas de test de différents types .pkg.
kLy
Je continue de faire des projets pour apprendre git / github, mais je ne l'ai pas vraiment fait. N'hésitez pas à vous en servir comme point de départ si vous souhaitez l'afficher sur Github ou ailleurs. FWIW, les seuls autres types de fichiers rencontrés sont les champs "empty" (réceptions de paquet) et "data". Mais je pense que la grande majorité d'entre eux sont des répertoires ou des archives 'xar'.
TJ Luoma