Hori Blog

フリーランスでバックエンドエンジニアとして活動している Ryota Hori のブログです。
最近はテック系記事より雑記ブログ気味。

Homebrew caskの古いバージョンを削除するワンライナー

Homebrew cask で古いバージョンのファイルを削除するワンライナーを作りました。

公式では非推奨として実装されていない機能なので、利用に関しては自己責任でお願いします。

とりあえずコード

これ。

for c in /opt/homebrew-cask/Caskroom/*; do vl=(`ls -t $c`) && for v in "${vl[@]:1}"; do rm -rf "$c/$v"; done; done

alias とか設定しておくと便利そう。こんな感じ。

alias brew-cask-clean-outdated='for c in /opt/homebrew-cask/Caskroom/*; do vl=(`ls -t $c`) && for v in "${vl[@]:1}"; do rm -rf "$c/$v"; done; done'

説明

Homebrew cask はbrew cask install application-nameみたいなコマンドでアプリがインストールできる便利なツールです。

Homebrew Cask

とまぁ便利なのですが、install してあるアプリのアップデート周りが諸々の事情で難しく…。

自分は以下のワンライナーを alias 登録して、update コマンドとして使っています。

alias brew-cask-update='for c in `brew cask list`; do ! brew cask info $c | grep -qF "Not installed" || brew cask install $c; done'

参考:brew cask upgrade · Issue #309 · caskroom/homebrew-cask

このスクリプトで新しいバージョンが Cask に登録されていればインストールされるのですが、古いバージョンの削除まではやってくれません。(不具合生じる可能性があるから組み込んでないとかなんとか)

困るのが Alfred などを使用している場合で、/opt/homebrew-cask/Caskroom/下にあるアプリを見に行くので古いバージョンも拾ってしまうのです。

ので、あくまで自己責任の範囲で作成したのが冒頭のスクリプト。

for c in /opt/homebrew-cask/Caskroom/*; do vl=(`ls -t $c`) && for v in "${vl[@]:1}"; do rm -rf "$c/$v"; done; done

Caskroom ディレクトリ下のアプリ全てに対し、バージョンごとのディレクトリを日時情報で降順ソート →2 つ目から削除って感じです。

update コマンド時に削除しようとするとこんな感じ?

alias brew-cask-update='for c in `brew cask list`; do ! brew cask info $c | grep -qF "Not installed" || brew cask install $c; done && brew-cask-clean-outdated'

アップデート時に削除するだけでいいならこれでいいかも。

alias brew-cask-update='for c in `brew cask list`; do ! brew cask info $c | grep -qF "Not installed" || brew cask uninstall $c --force && brew cask install $c; done'

新しいバージョンに切り替える前にアンインストールしちゃうのが気持ち悪いので、私はとりあえず前者の方を使ってみてます。

もしこうしたほうがいいよ!とかあれば教えて下さい〜