diff --git a/extras/list-apm-apps.sh b/extras/list-apm-apps.sh new file mode 100755 index 00000000..2876e748 --- /dev/null +++ b/extras/list-apm-apps.sh @@ -0,0 +1,187 @@ +#!/usr/bin/env bash + +get_script_dir() { + local source="${BASH_SOURCE[0]}" + while [ -L "$source" ]; do + local dir="$(cd -P "$(dirname "$source")" && pwd)" + source="$(readlink "$source")" + [[ $source != /* ]] && source="$dir/$source" + done + local dir="$(cd -P "$(dirname "$source")" && pwd)" + echo "$dir" +} + +find_apm_launcher() { + local script_dir="$1" + local paths=( + "${script_dir}/../extras/shell-helper/apm-launcher" + "/home/momen/Desktop/apm-app-store/extras/shell-helper/apm-launcher" + "/opt/apm-store/extras/shell-helper/apm-launcher" + "/usr/local/bin/apm-launcher" + ) + + for path in "${paths[@]}"; do + if [[ -f "$path" ]]; then + echo "$path" + return 0 + fi + done + + return 1 +} + +SCRIPT_DIR="$(get_script_dir)" +APM_LAUNCHER="$(find_apm_launcher "$SCRIPT_DIR")" + +if [[ -z "$APM_LAUNCHER" ]]; then + echo "Error: apm-launcher not found" >&2 + exit 1 +fi + +SHOW_DESKTOP=false + +function show_help() { + echo "Usage: $(basename "$0") [OPTIONS] [KEYWORD]" + echo "" + echo "List installed APM packages or desktop applications." + echo "" + echo "Options:" + echo " -d, --desktop List only desktop applications (with .desktop files)" + echo " -h, --help Show this help message" + echo "" + echo "Arguments:" + echo " KEYWORD Filter results by keyword (optional)" + echo "" + echo "Examples:" + echo " $(basename "$0") # List all installed packages" + echo " $(basename "$0") firefox # Search for firefox in packages" + echo " $(basename "$0") -d # List all desktop applications" + echo " $(basename "$0") --desktop firefox # Search for desktop apps named firefox" +} + +if [[ "$1" == "-h" || "$1" == "--help" ]]; then + show_help + exit 0 +fi + +if [[ "$1" == "-d" || "$1" == "--desktop" ]]; then + SHOW_DESKTOP=true + SEARCH_KEYWORD="${2:-}" +else + SEARCH_KEYWORD="${1:-}" +fi + +function get_desktop_name() { + local desktop_file="$1" + local name="" + + if [[ -f "$desktop_file" ]]; then + name=$(grep -m1 '^Name=' "$desktop_file" | cut -d= -f2-) + fi + + echo "$name" +} + +if [[ "$SHOW_DESKTOP" == "true" ]]; then + echo "正在扫描已安装包中的桌面应用..." + echo "" + + installed_pkgs=$(apm list --installed 2>/dev/null | \ + sed 's/\x1b\[[0-9;]*m//g' | \ + grep -vE "^Listing|^$|^\[INFO\]|^警告" | \ + grep "/" | \ + awk '{split($1,a,"/"); print a[1]}' | \ + sort) + + if [[ -z "$installed_pkgs" ]]; then + echo "未找到匹配的已安装包" + exit 0 + fi + + printf "%-35s %-20s %-10s | %s\n" "PKGNAME" "VERSION" "ARCH" "DESCRIPTION" + printf "%-35s-%-20s-%-10s-+-%s\n" "-----------------------------------" "--------------------" "----------" "---------" + + while IFS= read -r pkgname; do + [[ -z "$pkgname" ]] && continue + + desktop_files=$("$APM_LAUNCHER" list "$pkgname" 2>/dev/null) + + if [[ -n "$desktop_files" ]]; then + IFS=',' read -ra files <<< "$desktop_files" + for df in "${files[@]}"; do + app_name=$(get_desktop_name "$df") + if [[ -n "$app_name" ]]; then + pkg_info=$(apm show "$pkgname" 2>/dev/null) + version=$(echo "$pkg_info" | grep "^Version:" | cut -d: -f2 | xargs) + arch=$(echo "$pkg_info" | grep "^Architecture:" | cut -d: -f2 | xargs) + description=$(echo "$pkg_info" | grep "^Description:" | cut -d: -f2- | xargs) + + [[ -z "$arch" ]] && arch="amd64" + + if [[ -n "$SEARCH_KEYWORD" ]]; then + if [[ "$app_name" =~ $SEARCH_KEYWORD ]] || [[ "$pkgname" =~ $SEARCH_KEYWORD ]]; then + printf "%-35s %-20s %-10s | %s\n" "$pkgname" "$version" "$arch" "$app_name" + fi + else + printf "%-35s %-20s %-10s | %s\n" "$pkgname" "$version" "$arch" "$app_name" + fi + fi + done + fi + done <<< "$installed_pkgs" + + exit 0 +fi + +if [[ -n "$SEARCH_KEYWORD" ]]; then + installed_pkgs=$(apm list --installed 2>/dev/null | \ + sed 's/\x1b\[[0-9;]*m//g' | \ + grep -vE "^Listing|^$|^\[INFO\]|^警告" | \ + grep "/" | \ + awk '{split($1,a,"/"); print a[1]}' | \ + grep -i "${SEARCH_KEYWORD}" | \ + sort) + + if [[ -z "$installed_pkgs" ]]; then + echo "未找到匹配的已安装包" + exit 0 + fi + + printf "%-35s %-20s %-10s | %s\n" "PKGNAME" "VERSION" "ARCH" "DESCRIPTION" + printf "%-35s-%-20s-%-10s-+-%s\n" "-----------------------------------" "--------------------" "----------" "---------" + + while IFS= read -r pkgname; do + [[ -z "$pkgname" ]] && continue + + pkg_info=$(apm show "$pkgname" 2>/dev/null) + version=$(echo "$pkg_info" | grep "^Version:" | cut -d: -f2 | xargs) + arch=$(echo "$pkg_info" | grep "^Architecture:" | cut -d: -f2 | xargs) + description=$(echo "$pkg_info" | grep "^Description:" | cut -d: -f2- | xargs) + + [[ -z "$arch" ]] && arch="amd64" + + printf "%-35s %-20s %-10s | %s\n" "$pkgname" "$version" "$arch" "${description:0:50}" + done <<< "$installed_pkgs" + + exit 0 +fi + +if [[ "$SHOW_DESKTOP" == "false" && -z "$SEARCH_KEYWORD" ]]; then + apm list --installed 2>/dev/null | \ + sed 's/\x1b\[[0-9;]*m//g' | \ + grep -vE "^Listing|^$|^\[INFO\]|^警告" | \ + grep "/" | \ + awk '{ + n = split($0, parts, "/") + pkgname = parts[1] + if (pkgname == "") next + version = $2 + sub(/,.*/, "", version) + arch = $3 + match($0, /\[(.+)\]/, m) + flags = m[1] + printf "%-35s %-20s %-8s [%s]\n", pkgname, version, arch, flags + }' | sort + + exit 0 +fi