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'

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

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

Share Comments
comments powered by Disqus