有什么用

我使用的Linux系统为国产的deepin,在deepin上可以使用搜索来快捷搜索某个应用并打开,就像下面这样:

search_exmple

但想打开应用的话,它其实是不支持搜索AppImage的…
为了方便打开应用就有了这篇教学。

如何实现

其实也不难,就是添加一个.desktop和移动一下文件的事。

这里以Clash为例,来演示一下我是怎么将一个AppImage添加到自己的应用列表的。

解包AppImage

首先是给要应用化的AppImage创建一个文件夹作为应用文件夹,位置随意,我个人比较习惯在/home/$user/.local/下创建这个文件夹,就像下面这样:
path_example

接着将这个文件移动到这个文件夹下,我就不放命令了。

然后使用下面的命令可以对AppImage进行解包:

1
2
chmod +x your_app.AppImage
./your_app.AppImage --appimage-extract

结果会有一连串的输出,最终我们得到了一个名为squashfs-root的文件夹
squashfs-root

在这个文件夹下,是有图标文件的,一般在icons这个文件夹下,我们找到一个自己喜欢的,移动到应用文件夹里:
like_move

现在我们可以删掉这个squashfs-root的文件夹了。

desktop文件的编写和安装

一般来说,可以以下面的文本作为模板:

1
2
3
4
5
6
7
8
[Desktop Entry]
Categories=Utility;
Comment=Utility
Exec=$path/to/AppImage
Icon=$path/to/icon
Name=$app_name
Terminal=false
Type=Application

将其中的变量替换为你实际的路径、应用名就可以了。
对于我的clash,我使用的是下面的文本作为desktop文件:

1
2
3
4
5
6
7
8
[Desktop Entry]
Categories=Utility;
Comment=Clash
Exec=/home/Jese__Ki/.local/share/clash-for-linux/clash-verge_1.5.0_amd64.AppImage
Icon=/home/Jese__Ki/.local/share/clash-for-linux/clash-verge.png
Name=Clash For Linux
Terminal=false
Type=Application

将这个文件移动到你的桌面,可以直接双击打开应用。
但是到目前还不够,我们需要进一步的完善:

1
2
3
# 安装desktop和更新系统应用数据库
sudo desktop-file-install $path/to/your_app.desktop
sudo update-desktop-database

到这一步,你的AppImage就算作被安装在系统上了:
installed

一键脚本

可以看出,这个流程挺固定的,因此是可以使用脚本进行完成的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/bash

# 检查是否提供了AppImage路径
if [ -z "$1" ]; then
echo "Usage: $0 <AppImage path> [-c|--comment <comment>]"
exit 1
fi

APPIMAGE_PATH="$1"
shift # 移除已处理的参数
APP_NAME=$(basename "$APPIMAGE_PATH" | sed 's/\.AppImage$//')
USER_HOME="/home/$USER"
INSTALL_PATH="$USER_HOME/.local/share/$APP_NAME"
COMMENT="comment for $APP_NAME"
ICON_PATH=""

# 解析额外参数
while [ "$#" -gt 0 ]; do
case "$1" in
-c|--comment)
COMMENT="$2"
shift 2
;;
*)
shift
;;
esac
done

# 解包AppImage到当前目录
chmod +x "$APPIMAGE_PATH"
if ! "$APPIMAGE_PATH" --appimage-extract; then
echo "解包AppImage失败"
exit 1
fi

# 确认解包后的目录存在
if [ ! -d squashfs-root ]; then
echo "未找到预期的目录结构"
exit 1
fi

# 寻找图标文件
if ls squashfs-root/usr/share/*.png 1> /dev/null 2>&1; then
ICON_PATH=$(find squashfs-root/usr/share -name '*.png' | head -n 1)
elif find squashfs-root/usr/ -name '*.png' | grep -q .; then
ICON_PATH=$(find squashfs-root/usr/ -name '*.png' | head -n 1)
fi

# 移动AppImage和图标到安装路径
mkdir -p "$INSTALL_PATH"
mv "$APPIMAGE_PATH" "$INSTALL_PATH"
if [ ! -z "$ICON_PATH" ]; then
mv "$ICON_PATH" "$INSTALL_PATH"
ICON_PATH="$INSTALL_PATH/$(basename "$ICON_PATH")"
else
echo "未找到图标文件。"
fi

# 创建desktop文件
DESKTOP_FILE="$INSTALL_PATH/$APP_NAME.desktop"
cat << EOF > "$DESKTOP_FILE"
[Desktop Entry]
Categories=Utility;
Comment=$COMMENT
Exec=$INSTALL_PATH/$(basename "$APPIMAGE_PATH")
Icon=$ICON_PATH
Name=$APP_NAME
Terminal=false
Type=Application
EOF

# 安装desktop文件并更新数据库
sudo desktop-file-install "$DESKTOP_FILE"
sudo update-desktop-database

# 清理解压生成的目录
rm -rf squashfs-root

if [ "$ICON_PATH" = "" ]; then
echo "未找到图标文件,请手动将图标文件移动到 $INSTALL_PATH 目录下。"
fi

echo "安装完成。"

可以保存为.sh文件进行运行,使用方法为bash $script.sh $path/to/app.AppImage -c $comment

script : 表示为脚本的文件名
path/to/app.AppImage : 表示AppImage的路径
-c : 可选,表示desktop文件中的Comment字段的内容,默认为comment"