はじめに

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」ファイルは存在しません。

依存関係がないpackageのみを抽出して表示する

上記の仕様を元に、下記のようなperlスクリプトを作成して実行することにより、逆に依存関係がまったくない(他のpackageから一切必要とされない)インストール済みのpackageを抽出して表示することが可能です。

依存関係がないpackageのみを抽出して表示するサンプルコード(FindSAPKG.pl)
#!/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」ファイルの内容)を確認し、慎重に行ってください。

変更履歴

2013/02/03

・元のサンプルコードでは、空のファイル「 REQUIRED_BY」を持つpackageを取りこぼしていたため、サンプルコード17行目のファイルテスト演算子「-e」を「-s」に修正。
ご指摘頂いた方、ありがとうございました。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。