Diff of UNIX/コマンド/ファイル管理/ln


TITLE:ln - ハードリンクまたはシンボリックリンクの作成
#navi(UNIX/コマンド)
ln コマンドはハードリンクまたはシンボリックリンクを作成するコマンドです。
#contentsx

*ハードリンク解説 [#q2356ea6]

ハードリンクは同じ I ノードエントリを指すファイルを作成します。
ハードリンクとは同じ I ノードエントリを指すリンクファイルのことを指します。
普通ファイルというものは、

+データそのものの領域
+ファイルサイズ、作成日付、更新日付、データ領域へのポインタなどファイルの各種情報( I ノード)が格納された領域
+ディレクトリ直下のファイルやサブディレクトリの名前とそれぞれのファイルに対応する I ノード番号が格納された領域

によって構成されます。
例えばファイルを新規作成した場合や cp した場合は1、2、3の領域すべてで新しいエントリが作られ、
編集した場合は1、2の領域のエントリが変更され、
touch した場合は2の領域のエントリが変更され、
mv コマンドで移動した場合は3の領域が変更され、
そしてハードリンクを作成した場合は3の領域で新しいエントリが作成されます。
参考:[[北海学園大学・工学部・計算機工学3・第11回目>http://www.eli.hokkai-s-u.ac.jp/~kikuchi/comp3/chap11.html]]「ファイルシステムの構造」の項。
I ノードについては
 % stat [filename]
のように stat コマンドを使用して実際 I ノード情報を見てみるといいと思います。
ところで、[[ASCII - ハードリンク>http://yougo.ascii24.com/gh/31/003144.html]]ではハードリンク作成時に新たに I ノードエントリを作ると書いています。間違っていませんか?


*ハードリンク作成(ln) [#u4ea6f15]

ハードリンクは
 % ln [source] [target]
のように作成します。どちらか片方を編集すると両方に影響がでます。
I ノード番号を参照するには
 % ls -i
のように -i オプションを使用します。
 % ls -li hoge hige
 2375801 -rw-r--r--    2 s1080134 student         0 2003-09-30 19:56 hige
 2375801 -rw-r--r--    2 s1080134 student         0 2003-09-30 19:56 hoge
どちらも同じ I ノード番号であることが確認できると思います。
同じ I ノードエントリを指しているので実態は同じデータということになります。
片方を削除してもデータ領域はもちろん I ノードエントリも残るのでもう片方からいままでどおりアクセスすることが可能です。

ちなみにファイル削除の際に、I ノードエントリを残すかどうかの判断はハードリンク数を元に行われます。
さきほどの例だとハードリンク数が 2 であるわけですが、
このハードリンク数が削除(rm)によって 0 になった場合に UNIX は I ノードエントリを削除するという仕組みになっています。((データ領域そのものは削除しません。よって I ノードエントリを作り直しさえすれば復元することができたりします。他のファイルシステム(例えば Windows の NTFS) でも基本的には同様の原理で復元することができます。そういうソフトはあるので興味があれば「ファイル 復元」で検索してみましょう))

また、基本的にディレクトリのハードリンクを作成することはできません。
*シンボリックリンク解説 [#r98e206f]

シンボリックリンクはあるファイル(もちろんディレクトリファイルも)に対して、
その本来のパスに対して、別のパスからもアクセスできるようにします。
Windows でいえば、ショートカットのようなものです。
(実際は Windows ショートカットは引数も同時に記述しておけたりするので、
実装方法は違うものみたいですが。)
[[ASCII - シンボリックリンク>http://yougo.ascii24.com/gh/19/001945.html]]もあわせて読むとよいでしょう。

*シンボリックリンク作成(ln -s) [#sfba89a2]

シンボリックリンクは
 % ln -s [source] [target]
のようにして作成します。
 % ls -F
のようにして確認するとシンボリックリンクファイルにはファイル名の後ろに @ がつきます。
また、
 % ls -l
を実行すればリンク先も表示されます。~
シンボリックリンクを作成する場合は、[source] にファイルを指定するというよりも [target] からみたパスを指定します。
例えばカレントディレクトリに source という名前のファイルと test というディレクトリがあるとして、
 % ln -s source test/target
のように実行すると、
 target -> source
のようになり、test/target は同じ階層の source というファイル、つまり test/source を指すことになります。実際 source ファイルが存在しているのは test/target ファイルにとって一つ上の階層のファイルなので、
 % ln -s ../source test/target
のように実行してはじめて source ファイルに test/target からアクセスすることができるようになります。混乱するようでしたら、きちんとターゲットのディレクトリに
 % cd test
と移動してから
 % ln -s ../source .
のようにするといいでしょう。また、
 % ln -s ~/source ~/test/
のように絶対パスで書くのもいいでしょう。
第 2 引数がディレクトリ名のときは同名のファイル (ディレクトリ) が作成されます。
もちろんシンボリックリンクを削除しても本体には影響はでません。

cd [ディレクトリのシンボリックリンク] をする際に、本体ディレクトリのパスに移りたい場合は
 % cd -P [シンボリックリンク]
とします。

#navi(UNIX/コマンド,,footer)
xrea