How can I extract files from an AppImage?

Simple question, how can I extract files from an AppImage?

GUI, CLI, it doesn't matter, as long as it gets the job done.

I'm using openSUSE Tumbleweed if it matters


Solution 1:

First, look if your AppImage file is using the newest version of its internal format:

/path/to/your.AppImage --appimage-help

If you see the following line in the output:

--appimage-extract              Extract content from embedded filesystem image

you can conclude yourself how to proceed. In this case you have a (newer) type 2 AppImage format in front of you. (The 'path' part of the command may be relative or absolute.)

Second, if the first command didn't work, you can use a helper tool. However, you need sudo/root privileges for this: download appimagetool (which off course is available as an AppImage). Make it executable and run:

/path/to/appimagetool-x86_64.AppImage --list /path/to/your.AppImage

This should give you a list of all files and their (relative) paths embedded in your.AppImage. To extract your.AppImage into a directory named and located at /path/to/somedir , run

mkdir /path/to/somedir
/path/to/appimagetool-x86_64.AppImage /path/to/your.AppImage /path/to/somedir

Third, you can mount AppImages (type 1 as well as type 2) without the helper tool too:

  • Type 1:

    mkdir mountpoint
    sudo mount -o loop my.AppImage mountpoint/
    
    # You can now inspect the contents
    # You can now also copy the contents to a writable location of your hard disk
    
    sudo umount mountpoint/
    # Do not forget the umount step!
    # If you do forget it, your system may exhibit unwanted behavior.
    
  • Type 2:

    mkdir mountpoint
    my.AppImage --appimage-offset
    123456   # This is just an example output
    
    sudo mount my.AppImage mountpoint/ -o offset=123456
    
    # you can now inspect the contents
    
    sudo umount mountpoint/
    # Do not forget the umount step!
    # If you do forget it, your system may exhibit unwanted behavior.
    

Hint for the 'paranoid': If you do not want to trust the AppImage, the third method is preferable. Because running (for type 2 AppImages) the.AppImage --appimage-extract or the.AppImage --appimage-mount or the.AppImage --appimage-offset means you are actually executing an AppImage (though not its content).

Update:

To answer the question of @jayarjo in the comment below (how to re-package the AppImage after modifications?):

  1. You can use appimagetool not just to extract an existing AppImage into an AppDir. You can use it to also re-package the AppDir (possibly after some changes) back into a (modified) AppImage.

  2. Just run

     appimagetool -v /path/to/AppDir
    

    Watch output of command (made verbose by -v) for the location and name of the newly created AppImage. That's it.

Solution 2:

The --appimage-extract might not work sometimes:

./your.AppImage --appimage-extract

However, mount does

mkdir /tmp/mountpoint
sudo mount -o loop your.AppImage /tmp/mountpoint

Solution 3:

Based on the answer here, I've create this simple bash script. But I've never encounter an AppImage that I could extract with a loop device. EDIT: Just did: "wxHexEditor"

Here:

#!/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