Skip to content

Instantly share code, notes, and snippets.

@Hayao0819
Created April 22, 2021 12:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hayao0819/707be0f5ec468fa6205bf1bf5371eb56 to your computer and use it in GitHub Desktop.
Save Hayao0819/707be0f5ec468fa6205bf1bf5371eb56 to your computer and use it in GitHub Desktop.
Linuxにインストールされてるアプリの一覧をJsonで出力するスクリプト
#!/usr/bin/env bash
set -eu
AppDir="/usr/share/applications"
DesktopFileExt="desktop"
function getDesktopFile(){
#grep -E "^${2}" "${1}" | cut -d "=" -f 2 | tr -d "\n"
_Result="$(crudini --get "${1}" "Desktop Entry" "${2}")"
_Result="$(echo ${_Result} | tr -d "\"")"
if echo "${_Result}" | grep -q "^[0-9]\+$" || [[ "${_Result}" = true ]] || [[ "${_Result}" = false ]]; then
echo -n "${_Result}"
else
echo -n "\"${_Result}\""
fi
}
# Load AppList
while read -r app; do
AppList+=("${app}")
done < <(find "${AppDir}" -maxdepth 1 -mindepth 1 -name "*.${DesktopFileExt}" -printf "%f\n" 2> /dev/null | sed "s|.${DesktopFileExt}$||g" | sort)
JSON="{}"
Count=0
for _App in "${AppList[@]}"; do
Count=$(( Count + 1 ))
echo "Loading ${_App} ... ${Count}/${#AppList[@]} $(awk "BEGIN { print ${Count} * 100 /${#AppList[@]}}")%" >&2
_JsonName="$(echo -n "${_App}" | tr "." "_" | tr "-" "_")"
_DesktopFilePath="${AppDir}/${_App}.${DesktopFileExt}"
_setValueToJson(){
JSON="$(echo "${JSON}" | jq -c ".${_JsonName}.${1} = $(getDesktopFile "${_DesktopFilePath}" "${1}")")"
}
JSON="$(echo "${JSON}" | jq -c ".${_JsonName} = {}")"
_setValueToJson "Name"
_setValueToJson "Exec"
_setValueToJson "iCON"
_setValueToJson "Type"
_setValueToJson "Comment"
done
echo "${JSON}" | jq
@colrichie
Copy link

colrichie commented May 17, 2021

#!/bin/sh

Dir=/usr/share/applications                             # アプリ情報のあるDir名を設定

type makrj.sh || {
	cat <<-MSG
		このシェルスクリプトは、makrj.shというコマンドを必要とします。
		下記の場所からダウンロードして、実行ビットを立てて、
		PATHの通っている場所に置いてから本コマンドをもう一度実行してください。
		https://raw.githubusercontent.com/ShellShoccar-jpn/Parsrs/master/makrj.sh
		なお、makrj.shが何者か知りたい場合はこちらをどうぞ。
		https://qiita.com/richmikan@github/items/0dc3330163c86b249bcd
	MSG
	exit 1
}

awk '{s=ARGV[ARGIND];                                   #   1)ファイルパスをsに代入
      sub(/^.*[/]/,"",s);                               #   2)sをファイル名のみに
      sub(/\.[^.]*$/,"",s);                             #   3)sから".desktop"をトル
      gsub(/\./,"_",s);                                 #   4)全ての"."を"_"に置換
      printf("$.%s. %s\n",s,$0);}' ${Dir}/*             | # 5)「JSONPathと値」の前駆体を出力
# 現時点の列構成 1:"$.(アプリ名)" 2:"(属性名)=(値)"     #
grep -E '^[^[:blank:]]+ (Name|Comment|Exec|Icon|Type)=' | # 6)必要な属性名だけに絞る
sed 's/ \([^=]*\)=/\1 /'                                | # 7)「JSONPathと値」にする
# 現時点の列構成 1:"$.(アプリ名).(属性名)" 2:"(値)"     #
makrj.sh                                                #   8)「JSONPathと値」からJSONに変換

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment