ファイルパス名変換ツール
絶対パスと相対パスを相互変換するツールを開発しております。
ダウンロード:
PathConvert.tar.gz
最近のニュース
- 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モジュール をご参照ください。