FreeBSDのportsシステムは非常に良く出来ており、対象のportsをインストールする際に、そのportsが必要とする(依存している)portsや、portsを構築するのに必要なportsも一緒にビルドしてインストールしてくれます。
前者については、そのportsが動作するのに必須なportsのため、package DBに依存関係が保存されるのですが、後者については、ビルド時にのみ必要なもののため、対象のportsのビルドおよびインストールが完了した段階で不要になります。
このページでは、後者のようなインストール済みのpackageのうち、他のどのpackageからも必要とされない(他のpackageからの依存関係がない)packageを抽出して表示する方法について説明します。
ports/packageの依存関係の紐付けは非常にシンプルで、あるインストール済みのpackageにおいて、そのpackageを必要とするpackageが、利用される側のpackageのディレクトリ配下の「+REQUIRED_BY」ファイルの中に列挙されます。
例えば、「ja-mecab-0.96」は「ja-namazu2-2.0.16_2」のインストール時にnamazu2が依存するpackageということで、自動的にインストールされますが、インストールされた「ja-mecab-0.96」のパッケージフォルダ内の「/var/db/pkg/ja-mecab-0.96/+REQUIRED_BY」には、「ja-namazu2-2.0.16_2」のエントリが記述されています。(当該packageが複数のpackageから必要とされる場合には、エントリが複数記述されます。)
逆に依存関係がまったくない(他のpackageから一切必要とされない)場合には、この「+REQUIRED_BY」ファイルは存在しません。
上記の仕様を元に、下記のようなperlスクリプトを作成して実行することにより、逆に依存関係がまったくない(他のpackageから一切必要とされない)インストール済みのpackageを抽出して表示することが可能です。
#!/usr/bin/perl $iTargetDirectory='/var/db/pkg/'; opendir DIRECTORY,$iTargetDirectory; @tFileList=sort{$a cmp $b}(readdir DIRECTORY); closedir DIRECTORY; for($tCount1=0;$tCount1<=($#tFileList);$tCount1++) { $tFileName=$tFileList[$tCount1]; if(-d "$iTargetDirectory$tFileName") { if(($tFileName ne '.')&&($tFileName ne '..')) { if(!(-s "$iTargetDirectory$tFileName/+REQUIRED_BY")) { print "$tFileName\n"; } } } }
$ perl FindSAPKG.pl
上記のようにして表示されたpackageについては、自分がインストールした覚えのないものについては、削除しても大丈夫な可能性があります。
但し、必ずしも依存関係がないからといって、削除していいかというと、そうでもないようです。
インストール済みのpackageを削除するには、packageコメント(packageフォルダ内の「+COMMENT」ファイルの内容)を確認し、慎重に行ってください。
・元のサンプルコードでは、空のファイル「 REQUIRED_BY」を持つpackageを取りこぼしていたため、サンプルコード17行目のファイルテスト演算子「-e」を「-s」に修正。
ご指摘頂いた方、ありがとうございました。
・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。
まだ評価がありません |
表示できるメッセージはありません。