Manera infalible de extraer archivos .pkg

1

Sé que hay algunas herramientas GUI de pago que te permiten hacer esto, pero no estoy interesado en ellas.

Actualmente, estoy haciendo esto:

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

Sin embargo, hay algunos archivos pkg que ahora son archivos xar y necesito pkgutil para extraerlos. Y probablemente hay otras permutaciones de pkg spec que no conozco.

La conclusión es que siempre puedo encontrar alguna forma de eliminar manualmente las cosas del paquete, pero me gustaría una solución de un solo disparo que haría esto automáticamente sin preocuparse por la implementación específica del paquete, digamos:

unpkg CrappyPackage.pkg

¿Existe tal cosa?

Tal vez la forma más infalible es usar el instalador del sistema en sí, pero parece que siempre necesita una unidad de sistema completa como objetivo. Sería realmente útil si pudieras hacer algo como:

installer -pkg CrappyPackage.pkg -target SomeEmptySandbox.dmg

Sé que hay una pregunta: ¿Cómo puedo abrir? un archivo .pkg manualmente? Sin embargo, todas las soluciones ofrecidas son bastante manuales y las estoy haciendo ahora mismo de todos modos.

    
pregunta kLy 29.12.2011 - 17:13

1 respuesta

4

Es bastante fácil crear un script de shell que comprueba algunas condiciones y luego realiza la acción adecuada.

He puesto el mío en enlace pero copiaré la versión inicial a continuación:

#!/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 se ha incluido en Mac OS X para varias versiones ahora. Lo prefiero a / bin / sh porque ... bueno, no entremos en una guerra de "mi shell es mejor que tu shell", porque mi shell ganaría :-)

En cualquier caso, zsh hace las cosas un poco más fáciles y un poco más agradables, y está incluido, por lo que no hay razón para no usarlas, OMI. Especialmente para un script específico de OS X como este.

Esto fue probado en 10.7.

    
respondido por el TJ Luoma 29.12.2011 - 19:56

Lea otras preguntas en las etiquetas