シンボリックリンクのリンク先や絶対パス名を取得したい

Unix 上でシンボリックリンクのリンク先を取得したい.特に何重にもリンクが重なっている場合でも,最終的なリンク先を一意に決定したい.さらに相対パスがあれば絶対パスにしたい.どうするか.

とりあえず readlink とか realpath とかいうコマンドがまさに使えることがわかった.しかし,手元のマシンにはそんなものは入っていないので,以下のページに載っていたソースをそのまま流用してみた.正直,手元で簡単に使うためだけのものなので,安全策は特に何もありませんし動作も保証できません(激ぉ

#include <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] ){
    char resolved_path[MAXPATHLEN];
    if ( argc < 2 ){
	fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
	exit(1);
    }
    if ( realpath( argv[1], resolved_path) == NULL ){
	perror( argv[1] );
	exit(1);
    }
    printf("%s\n", resolved_path);
    exit(0);
}

追記 (2008-01-24): Perl ワンライナーでできるそうです.素晴らしい.

つーか,Perl のモジュールって色々ありすぎてまったくわからない.みんなどうやって把握しているのだろう.