読者です 読者をやめる 読者になる 読者になる

Uva Advent Calendar 一日目

Uva Advent Calendar 1 日目。

今日は 1 日目ということで、Uva じゃないことを書こうかと思います。
ある日、dotnet-cli をインストールしようと思ったんですが、/ がパンパンでビルド中にあぼーんしてしまいます。

これはいかん! と思って、そんなに必要じゃないパッケージを消そうと思いました。
結局のところ、~/ でビルドすることで事なきを得たんですが、その前にやったことを書いておこうと思います。

他のパッケージに必要とされていないパッケージの一覧を得る

ArchWiki によると、「孤立した、他のパッケージに必要とされていないパッケージの一覧を得る」には:

% pacman -Qdt

と打てば良いことがわかります。
これは、pacman -Q と打ったときと同じフォーマット(<パッケージ名> <バージョン>)なので、 awk{ print $1; } を使うことで、パッケージ名だけの一覧にすることができます。
シェルスクリプトにするとこんな感じです:

% pacman -Qdt | awk '{ print $1; }'

それぞれのパッケージ情報を得る

あとは、それぞれのパッケージのインストール容量を知りたいので、それぞれに yaourt -Qi <パッケージ名> したいですよね。
AWK スクリプトにすると、こんな感じです:

# gen-package-info.awk
{
    print "yaourt -Qi" $1 " > " $1 ".pacinfo"
}

gen-package-info.awk を使って、こんな風に打ってみます:

% yaourt -Qdt | awk -f gen-package-info.awk | sh

標準出力にパッケージ一覧分の yaourt -Qi ${パッケージ名} > ${パッケージ名}.pacinfo を出力し、 それを sh に標準入力として渡すことで、sh に実行してもらいます。

パッケージ名とインストール容量を抜粋する

あとは ${パッケージ名}.pacinfo を見ていけば良いのですが、多すぎると、忘れちゃいますよね((ニワトリ頭))。
なんとかして、パッケージ名とインストール容量だけを抜き出せないものでしょうか。

とりあえず、.pacinfo はこんな感じになっています:

名前                   : hiredis
バージョン             : 0.13.3-1
説明                   : Minimalistic C client library for Redis
アーキテクチャ         : x86_64
URL                    : https://github.com/redis/hiredis/
ライセンス             : BSD
グループ               : なし
提供                   : なし
依存パッケージ         : glibc
提案パッケージ         : なし
必要パッケージ         : なし
任意パッケージ         : なし
衝突パッケージ         : なし
置換パッケージ         : なし
インストール容量       : 109.00 KiB
パッケージ作成者       : Massimiliano Torromeo <massimiliano.torromeo@gmail.com>
ビルド日時             : 2015年10月12日 16時41分02秒
インストール日時       : 2016年11月08日 23時33分42秒
インストール方法       : 他のパッケージの依存関係としてインストール
インストールスクリプト : No
検証方法               : 署名

これもやっぱり、AWK で処理可能です。

$1名前 の時と インストール容量 の時に、$3 が目的の値であることがわかります。
今回は JSON に変換して、Node.JS で処理してみましょう。
JSON に変換する AWK スクリプトがこちらです:

# gen-install-size.awk
BEGIN {
    print "[";
}

{
    if ( $1 == "名前" ) {
        print "{";
        print "\"name\": \"" $3 "\",";
    }

    if ( $1 == "インストール容量" ) {
        print "\"install-size\": \"" $3 $4 "\"";
        print "},";
    }
}

END {
    print "]";
}

これを使って下のように打ってみます:

% awk -f ./gen-install-size.awk *.pacinfo > ./install-size.json

これによってできた install-size.json を以下の ranking-install-size.ls で処理すると多分できます。

# ranking-install-size.ls
require! 'package-size.json': package-size-json

compare-install-size = (left, right) ->
  left.install_size - right.install_size

package-sizes = package-size-json.map (record) ->
  name = record['name']

  install-size-text = record['install-size']
  install-size = parse-float install-size-text

  if /MiB$/.test install-size-text
    install-size = install-size * 1000

  { name: name, install_size: install-size }

for record in package-sizes.sort( compare-install-size )
  console.log "#{record.name}: #{record.install_size} KiB"

おしまい。

参考