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"
おしまい。