絶対パスと相対パスを相互変換するツールを開発しております。
ダウンロード: PathConvert.tar.gz

GitHub

最近のニュース

2016/11/23
pathconvert ライブラリが FreeBSD のコア (libpathconv) に採用されました。
2006/7/11
bashスクリプト'abs2rel'はメインテナンスされておりませんので削除させていただきました。
2005/12/19
CライブラリのLGPL版を追加しました。
2005/8/9
Mac OS X でrel2abs が使われているようです。
2004/8/29
Makefileを一般的なものに置き換え、READMEのインストール手続きを書き換えました。
2004/2/9
関数 rel2abs() のバグを修正致しました。
2002/2/14
関数 abs2rel() が GNU Global ソースコードタグシステムで採用されました。
1999/2/15
File::PathConvert モジュールが File::Spec にマージされ、Perlの開発中バージョン(5.005_55) のコアに含まれました。
1999/2/3
Barrie Slaymaker 様による File-PathConvert-0.85 を追加しました。

動機

UNIX ファイルシステムでは、ファイルまたはディレクトリを指定する際に、「絶対パス」と「相対パス」の二つの指定方法があります。この二つの指定方法にはそれぞれ一長一短がありますので相互に変換できることが望ましいのですが、変換のための標準的な方法はありませんでした。

本プロジェクトは、絶対パスと相対パスの相互変換ツールを提供することでUNIX のファイルシステムをより使いやすくすることを意図したものです。

成果

本プロジェクトの成果物は、下記の通りです。

C言語のためのパス変換ライブラリ

二つの関数が利用可能です。

abs2rel(): 絶対パスを相対パスに変換します。

abs2rel(変換対象パス, 基準ディレクトリ, 変換結果格納バッファ, バッファ長)

char result[MAXPATHLEN];
abs2rel("/usr/src/sys", "/usr/local/lib", result, MAXPATHLEN);
printf("path1 = %s\n", result);
abs2rel("/usr/src/sys", "/usr", result, MAXPATHLEN);
printf("path2 = %s\n", result);
abs2rel("/usr/src/sys", "/usr/src/sys", result, MAXPATHLEN);
printf("path3 = %s\n", result);
(上記のプログラムの実行結果)
path1 = ../../src/sys
path2 = src/sys
path3 = .
rel2abs(): 相対パスを絶対パスに変換します。

rel2abs(変換対象パス, 基準ディレクトリ, 変換結果格納バッファ, バッファ長)

char result[MAXPATHLEN];
rel2abs("../../src/sys", "/usr/local/lib", result, MAXPATHLEN);
printf("path1 = %s\n", result);
rel2abs("src/sys", "/usr", result, MAXPATHLEN);
printf("path2 = %s\n", result);
rel2abs(".", "/usr/src/sys", result, MAXPATHLEN);
printf("path3 = %s\n", result);
(上記のプログラムの実行結果)
path1 = /usr/src/sys
path2 = /usr/src/sys
path3 = /usr/src/sys

カスタム lndir コマンド

Lndir コマンドは、シャドーツリーを作るコマンドです。ディレクトリ構造をコピーしながら、ファイルはコピーしないで、元のファイルにシンボリックリンクを張ります。カスタム lndir コマンドは、X11に含まれるオリジナル版を元に、引数で絶対パスを指定しながら相対シンボリックリンクを生成するように変更したものです。

実行イメージ

% mkdir /tmp/sys_shadow
% lndir /usr/src/sys /tmp/sys_shadow
/usr/src/sys/compile:
/usr/src/sys/conf:
/usr/src/sys/ddb:
/usr/src/sys/dev:
	.
	.
	.
% cd /tmp/sys_shadow
% ls -lL Makefile
-rw-r--r--  1 root  wheel  190 Jun 14  1996 Makefile
% ls -l Makefile
lrwxr-xr-x  1 owner  wheel  26 Dec 29 14:18 Makefile -> ../../usr/src/sys/Makefile

コマンドラインで絶対パスを指定しながら、生成されるシンボリックリンクが相対パスになっている点にご注目ください。オリジナル版では絶対パスを生成します。相対パスによるシャドーツリーは、ツリー全体を別の場所に移動させることが容易で、複数のマシンからリモートマウントして参照する場合にも都合がよいのです。

カスタム ln コマンド

カスタム ln コマンドは、GNU fileutils および FreeBSD に含まれるそれぞれのオリジナル版 ln コマンドに、二つのオプション、-a(--absolute)と-r(--relative) を追加して、シンボリックリンクを相対リンクにするか、絶対リンクにするかを選択できるようにしたものです。

コマンドラインの指定は絶対パスで行いたいが、シンボリックリンクは相対パスにしたい場合や、指定は相対パスで行いたいが、シンボリックリンクは絶対パスにしたいという時に便利です。

例1: 絶対パスの指定で相対シンボリックリンクを作る。

% cd /home/owner
% ln -sfr /etc/hosts .
% ls -l hosts
lrwxr-xr-x  1 owner  users  15 Nov 21 15:36 hosts -> ../../etc/hosts

例2: シンボリックリンクをカレントディレクトリ以外の場所に作成する。

% cd /usr/src/sys
% ls -l kern/tty.c
-rw-r--r--  1 root  wheel  56525 Jul  3 09:27 kern/tty.c
% ln -sfr kern/tty.c /home/owner/tmp	# 相対指定
% ls -l /home/owner/tmp/tty.c
lrwxrwxrwx  1 owner  users  31 Jul 13 13:28 /home/owner/tmp/tty.c -> ../../../usr/src/sys/kern/tty.c
% ln -sfa kern/tty.c /home/owner/tmp	# 絶対指定
% ls -l /home/owner/tmp/tty.c
lrwxrwxrwx  1 owner  users  31 Jul 13 13:28 /home/owner/tmp/tty.c -> /usr/src/sys/kern/tty.c
% ln -sf kern/tty.c /home/owner/tmp	# 指定なし
% ls -l /home/owner/tmp/tty.c
lrwxrwxrwx  1 owner  users  10 Jul 13 18:08 /home/owner/tmp/tty.c -> kern/tty.c

オリジナル ln コマンドでは、引数で指定されたパスの文字列はそのままシンボリックリンクの値として使用されます。最後の「指定なし」の例では、ln コマンドの引数がすべて実在するパスであるにも関わらず、シンボリックリンクは実在しないパスを指しています。-a または-r オプションを指定した場合は、実在するファイルに対して張ったシンボリックリンクは、必ず実在するファイルを指すことにご注目ください。

例3: 存在しないファイルにシンボリックリンクを張る。

% cd /usr/src/sys
% ls -l kern/noexist.c
ls: kern/noexist.c: No such file or directory
% ln -sr kern/noexist.c /home/owner/tmp
% ls -l /home/owner/tmp/noexist.c
lrwxrwxrwx  1 owner  users  36 Jul 13 17:53 /home/owner/tmp/noexist.c -> ../../../usr/src/sys/kern/noexist.c
(存在しないけれど正しいシンボリックリンク)

存在しないファイルにシンボリックリンクを張ることが出来るのはバグではなく、シンボリックリンク本来の仕様です。ひとまとまりの作業の中で、ファイルを作る前にそのファイルに対するシンボリックだけを作っておきたい場合や、今はファイルはないが、ある状況の元では存在するという時に便利です。-a および -r オプションの実装もこの流儀にしたがっています。

例4: 相対リンクによるシャドウトリーを作成します。

% cd /usr/src/sys
% set obj=/usr/obj`pwd`
% mkdir -p $obj
% find * -type d -exec mkdir $obj/'{}' ';'
% find * -type f -exec ln -sr '{}' $obj/'{}' ';'

前掲のlndir と同様の仕事をします。

Perl5 のためのFile::PathConvert モジュール

abs2rel(), rel2abs() をPerl5 のモジュールにしたものです。

本モジュールは、perl-5.6 以降で標準に含まれるFile::Spec モジュールにマージされました。 CPANのFile::Specモジュール をご参照ください。

Copyright 2019, Tama Communications Corporation.