如何从AppImage中提取文件?

简单问题,如何从AppImage中提取文件?
无论是图形界面还是命令行界面都可以,只要能完成任务就行。 如果有关系的话,我正在使用openSUSE Tumbleweed

4https://github.com/AppImage/AppImageKit/wiki/Extracting-AppImages - Arkadiusz Drabczyk
@Sekhemty:你有没有看到下面提供的答案? - Kurt Pfeifle
6个回答

首先,查看您的AppImage文件是否使用了最新版本的内部格式。
/path/to/your.AppImage --appimage-help

如果您在输出中看到以下行:
--appimage-extract              Extract content from embedded filesystem image

你可以自行决定如何继续操作。在这种情况下,你面前有一个(更新的)type 2 AppImage 格式。(命令中的“路径”部分可以是相对路径或绝对路径。)
其次,如果第一个命令没有起作用,你可以使用一个辅助工具。然而,你需要 sudo/root 权限来执行此操作:下载 appimagetool(当然也可以作为一个 AppImage 文件提供)。将其设置为可执行并运行:
/path/to/appimagetool-x86_64.AppImage --list /path/to/your.AppImage

这将为您提供一个包含所有文件及其(相对)路径的列表,这些文件嵌入在your.AppImage中。要将your.AppImage提取到名为并位于/path/to/somedir的目录中,请运行
mkdir /path/to/somedir
/path/to/appimagetool-x86_64.AppImage /path/to/your.AppImage /path/to/somedir

第三,您也可以不使用辅助工具来挂载AppImages(包括类型1和类型2)。
  • 类型1:

    mkdir mountpoint
    sudo mount -o loop my.AppImage mountpoint/
    
    # 现在您可以检查内容了
    # 您还可以将内容复制到硬盘的可写位置
    
    sudo umount mountpoint/
    # 不要忘记卸载步骤!
    # 如果忘记了,系统可能会出现意外行为。
    
  • 类型2:

    mkdir mountpoint
    my.AppImage --appimage-offset
    123456   # 这只是一个示例输出
    
    sudo mount my.AppImage mountpoint/ -o offset=123456
    
    # 现在您可以检查内容了
    
    sudo umount mountpoint/
    # 不要忘记卸载步骤!
    # 如果忘记了,系统可能会出现意外行为。
    

对于“多疑者”的提示:如果您不想信任AppImage,第三种方法更可取。因为运行(对于类型2的AppImages)the.AppImage --appimage-extractthe.AppImage --appimage-mountthe.AppImage --appimage-offset意味着您实际上正在执行一个AppImage(尽管不是其内容)。

更新:

回答下面评论中@jayarjo的问题(如何在修改后重新打包AppImage?):

  1. 你不仅可以使用appimagetool将现有的AppImage提取到AppDir中,还可以使用它将(经过一些更改后的)AppDir重新打包成(修改后的)AppImage。

  2. 只需运行

     appimagetool -v /path/to/AppDir
    

    观察命令的输出(通过-v参数使其详细显示),以获取新创建的AppImage的位置和名称。就是这样。


你知道怎么打包回去吗?假设我已经提取了它,修改了一些脚本,现在想把它制作成一个AppImage。 - jayarjo
1@jayarjo:你不仅可以使用appimagetool将现有的AppImage提取到AppDir中,还可以使用它将(经过一些更改后的)AppDir重新打包成(修改后的)AppImage:“appimagetool -v /path/to/AppDir”。通过命令的输出(由*-v*使其详细显示),可以找到新创建的AppImage的位置。就是这样。 - Kurt Pfeifle
第二种方法(使用AppImage工具)目前只适用于Type 1 AppImages。在这种情况下,appimagetool会出现“尚未实现”的错误信息。 - Nemo

将扩展名更改为.7z
$ mv file.AppImage file.7z

使用文件管理器提取
$ file-roller --extract-here file.7z 

你的回答(提取命令)出现了一个错误:GtkDialog没有设置一个父窗口。这是不被鼓励的,命令将退出(CentOS)。 - pebox11

我只是用右键重命名,例如:

compress-pdf-v0.1-x86_64.AppImage

给:

compress-pdf-v0.1-x86_64.zip

然后右键单击
"在此处提取"
并且正在工作
将所有文件提取到一个文件夹中

--appimage-extract 有时可能无法正常工作:

./your.AppImage --appimage-extract

然而,mount并不会。
mkdir /tmp/mountpoint
sudo mount -o loop your.AppImage /tmp/mountpoint

根据这里的答案,我创建了这个简单的bash脚本。但是我从来没有遇到过可以使用循环设备提取的AppImage。编辑:刚刚试了一下:"wxHexEditor"
这里:
#!/bin/bash

APP="$2"
UNPK="$(echo $APP | sed 's/\.AppImage//')"

case "$1" in
  -a)
      chmod +x $APP;
      ./$APP --appimage-extract
      mv squashfs-root $UNPK
      ;;
  -b)
      mkdir -p /tmp/$UNPK
      sudo mount -o loop $APP /tmp/$UNPK &>/dev/null
      mkdir -p ~/Desktop/$UNPK
      cp -R /tmp/$UNPK/* ~/Desktop/$UNPK &>/dev/null
      sudo umount /tmp/$UNPK
      ;;
  *)
      echo
      echo "   Usage: appunpack [option] AppImageFile"
      echo 
      echo "   Options: -a  Unpack using --appimage-extract"
      echo "            -b  Unpack using a loop device"
      ;;
esac

当我在aarch64基本系统环境中需要提取appimagetool时,我遇到了同样的问题。问题是AppImage应用程序无法执行,因为出现了Exec格式错误
整个问题在于如何获取squashfs文件系统的偏移量。如果您有它,可以使用此处已经描述过的方法之一。最后解决方案非常简单。我猜我正在使用第二类型的AppImage。在AppImage的开头是ELF文件,然后是squashfs的图像。 ELF文件的大小(= AppImage的偏移量)可以根据readelf -h AppImageFile命令的信息计算得出。请参见这里 ELF文件的大小
为了满足我的需求,我编写了一个简单的bash脚本。期望图像存储在/tmp/appimagetool中。
    ELFSIZE=$(readelf -h /tmp/appimagetool)
    START_OF_SECTION=$(echo $ELFSIZE | grep -oP "(?<=Start of section headers: )[0-9]+")
    SECTION_SIZE=$(echo $ELFSIZE | grep -oP "(?<=Size of section headers: )[0-9]+")
    SECTION_NO=$(echo $ELFSIZE | grep -oP "(?<=Number of section headers: )[0-9]+")
    APPIMG_OFFSET=$(( $START_OF_SECTION + $SECTION_SIZE * $SECTION_NO ))

将图像提取到文件夹/usr/local/share/appimagetool中,使用以下命令。
unsquashfs -o $APPIMG_OFFSET -d /usr/local/share/appimagetool /tmp/appimagetool

终于可以创建到可执行文件的链接了。
ln -s /usr/local/share/appimagetool/AppRun /usr/local/bin/appimagetool

  • 相关问题