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
みたいなコマンドでアプリがインストールできる便利なツールです。
とまぁ便利なのですが、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'
このスクリプトで新しいバージョンが 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'
新しいバージョンに切り替える前にアンインストールしちゃうのが気持ち悪いので、私はとりあえず前者の方を使ってみてます。
もしこうしたほうがいいよ!とかあれば教えて下さい〜