Как извлечь файл .dmg в Linux?

19

Как пользователь Linux, мне нужно получить содержимое файла .dmg (образ диска Mac OSX), который содержит установщик приложения.

Я пытался dmg2dir(что требует dmg2img), который создал файл .img, но ничего больше.

$ 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.

Мне просто нужно распаковать файлы из файла .dmg, я не хочу его монтировать.

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

qubodup
источник
1
Это образ диска. Если кто-то не проделал всю работу (которую, я полагаю, 7z) сделал для записи программ чтения файловой системы в свою программу, самый простой способ - использовать модули файловой системы ядра Linux для чтения данных. Что означает монтаж.
Zan Lynx

Ответы:

31

Просто используйте 7z x.

В случае, например, Sublime text, 7z x "Sublime Text 2.0.2.dmg"будет достаточно извлечь все файлы.

В других случаях, таких как, например, JDK, вам приходится иметь дело с какой-то матрешкой.

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

Но в конечном итоге вы получите папку, содержащую файлы, которые вы ищете.

qubodup
источник
Извлечение dmg-файлов с помощью 7z, по-видимому, пропускает исполняемые биты, делая извлеченные приложения из DMG дисфункциональными. Может быть связано: sourceforge.net/p/p7zip/bugs/113
Мотин
1

На Mac, если dmg является изображением каталога, содержащего все файлы, создайте tgz каталога вместо dmg и перенесите его.

#!/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
Dick.Guertin
источник