Backup source of UNIX/コマンド/ファイル管理/ln(No. 4)

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

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

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

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

によって構成されます。
例えばファイルを新規作成した場合や cp した場合は1、2、3の領域すべてで新しいエントリが作られ、
編集した場合は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 オプションを使用します。どちらも同じ番号であることが確認できると思います。
同じ番号ということは同じ 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 ノードエントリを残すかどうかの判断はハードリンク数から行います。
さきほどの例だとハードリンク数が 2 であるわけですが、
このハードリンク数が削除によって 0 になった場合に UNIX は I ノードエントリを削除するという仕組みになっています。~
ちなみに、基本的にディレクトリのハードリンクを作成することはできません。

*シンボリックリンク解説 [#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 引数がディレクトリ名のときは同名のファイル (ディレクトリ) が作成されます。
これももちろんシンボリックリンクを削除しても本体には影響はでません。
RIGHT:written by s1080134
#navi(UNIX/コマンド,,footer)
----
#vote2(役に立った[6],まあまあ[0],役に立たなかった[0],notimestamp)
役に立たなかった場合コメントをお願いします。
#comment(below)
xrea