列出我可以使用 brew-cask 安装的应用程序

List up my apps installable with brew-cask

我想知道我的哪些应用程序可以使用 brew cask 命令安装。
我该怎么做?


规格
我想要做的是从 /Applications 中的所有应用程序中提取 brew-cask 上也可用的应用程序,并列出它们的包名。

# /Applications
Alfred 4.app
App Store.app
AppCleaner.app
Automator.app
Be Focused Pro.app
BetterTouchTool.app
Bitdefender
Bluetooth Explorer.app
Books.app
Calculator.app
Calendar.app
CheatSheet.app
Chess.app
Clipy.app
...
# package names of apps available on brew-cask
alfred
appcleaner
bettertouchtool
calibre
cheatsheet
clip
...

您可以在终端上使用 brew search,例如这些示例:

  • brew search vlc
  • brew search mamp
  • brew search slack
  • ...等等

您将获得与您的搜索相对应的可用 brew casks,您可以使用 brew cask install mamp 安装它(将 mamp 替换为您自己的应用程序)

您也可以进入此页面 https://formulae.brew.sh/cask/ 查看所有可用的木桶。

如果您的应用已经安装,您需要使用brew cask install --force mamp强制重新安装并且link您的应用已经安装。

更多的解释可以到这里https://sourabhbajaj.com/mac-setup/Homebrew/Cask.html

这可以使用 Homebrew’s JSON API as well as some jq 魔法 (brew install jq)。

  1. 假设您的 .app 文件名中的 none 包含换行符(极不可能),您可以将列表作为 JSON 数组与 a command combining ls and jq.然而,由于我们将使用该列表作为查找,因此最好创建一个对象:

    ls /Applications \
    | \grep '\.app$' \
    | jq -Rsc 'split("\n")[:-1]|map({(.):1})|add'
    

    这将创建一个对象,每个应用程序作为键,1 作为值(值在这里不重要)。它输出类似:

    {"1Password 7.app":1,"Amphetamine.app":1, "Firefox.app":1, …}
    
  2. 您可以使用 brew search --casks 列出所有 3,500 多个可安装的 casks。为了获得描述一个或多个 cask(s) 的 JSON,包括他们安装的 .app,您可以使用 brew cask info --json=v1 <cask> ….

    结合这两个,我们可以得到一个巨大的 JSON 描述所有可安装的桶:

    brew search --casks '' \
    | xargs brew info --cask --json=v2 \
    > allcasks.json
    

    此命令在我的机器上需要大约 10 秒,因此将其保存在文件中是个好主意。

  3. 我们现在可以过滤此列表以仅从我们之前的列表中提取安装 .apps 的 casks:

    cat allcasks.json \
    | jq -r --argjson list '{…the list…}' '.[]|.[]|(.artifacts|map(.[]?|select(type=="string")|select(in($list)))|first) as $app|select($app)|"\(.token): \($app)"'
    

    用我们之前创建的对象替换{…the list…}

    这会打印出如下内容:

    1password: 1Password 7.app
    firefox: Firefox.app
    google-chrome: Google Chrome.app
    …
    

如果您喜欢冒险,这里有一个一次性执行所有这些命令的代码:

brew search --casks '' \
|xargs brew info --cask --json=v2 \
|jq -r --argjson l "$(ls /Applications|\grep '\.app$'|jq -Rsc 'split("\n")[:-1]|map({(.):1})|add')" '.[]|.[]|(.artifacts|map(.[]?|select(type=="string")|select(in($l)))|first) as $a|select($a)|"\(.token): \($a)"'

jq 命令的分解:

.[] # flatten the list
 |  # then for each element:
 .[] # flatten the list
 |  # then for each element:
   ( # take its artifacts
     .artifacts
      # then for each one of them
      | map(
         # take only arrays
         .[]?
         # select their string elements
         | select(type=="string")
         # that are also in the list
         | select(in($list)
       )
   )
   # take the first matching artifact
   | first)
   # and store it in $app
   as $app
 # then take only the elements with a non-empty $app
 | select($app)
 # and print their name (.token) and the app ($app)
 |"\(.token): \($app)"