Como extrair um arquivo .dmg no Linux?


19

Como usuário do Linux, preciso obter o conteúdo de um arquivo .dmg (imagem de disco do Mac OSX) que contém um instalador do aplicativo.

Eu tentei dmg2dir(o que requer dmg2img) que criou um arquivo .img, mas nada mais.

$ sudo dmg2dir jdk-8u51-macosx-x64.dmg
==> Routines successfully accomplished. Ready! 
==> Prepare loop device... 
==> Mount block device... 
Error looking up object for device /dev/disk/by-label/JDK\x208\x20Update\x2051 INTENSO openSUSE\x20Live\x20CD\x20GNOME dump
Variable is empty.

Eu só preciso dos arquivos do arquivo .dmg descompactados, não quero montá-lo.

Caso você esteja curioso, preciso disso para criar um ambiente de desenvolvimento portátil para ser usado em oficinas em computadores que não podem ser preparados antecipadamente.


1
É uma imagem de disco. A menos que alguém tenha feito todo o trabalho (o que acho que o 7z fez) para gravar os leitores do sistema de arquivos em seu programa, a maneira mais fácil é usar os módulos do sistema de arquivos do kernel Linux para ler os dados. O que significa montá-lo.
Zan Lynx

Respostas:


31

Apenas use 7z x.

No caso de, por exemplo, texto sublime, 7z x "Sublime Text 2.0.2.dmg"será suficiente para extrair todos os arquivos.

Em outros casos, como, por exemplo, o JDK, você precisa lidar com algum tipo de matryoshka.

$ 7z x jdk-8u51-macosx-x64.dmg
$ cd JDK 8 Update 51/
$ 7z x JDK 8 Update 51.pkg
$ 7z x Payload~

Mas, eventualmente, você receberá uma pasta contendo os arquivos que está procurando.


A extração de arquivos dmg com 7z parece perder os bits executáveis, tornando disfuncionais os aplicativos extraídos dos DMGs. Pode estar relacionado: sourceforge.net/p/p7zip/bugs/113
Motin


1

No Mac, se o dmg for uma imagem de um diretório contendo todos os arquivos, faça um tgz do diretório em vez de um dmg e migre-o.

#!/bin/bash
if [ -d "$1" ]; then  # $1 is the directory name
tar -cf "$1.tar" "$1" || exit  # First, create a tar-file
gzip -n -S .gz "$1.tar"  # Then ,gzip it to compress it.
mv "$1.tar.gz" "$1.tgz"  # Then rename it ti a .tgz
echo "Created $PWD/$1.tgz"
else echo "Not a directory"
fi
exit 0
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.