ln コマンドのおぼえかた

ln -s でシンボリックリンクを作成するたびに、引数の一番目と二番目、どっちがリンクのパスで、どっちが元となるパスかがわからなくなる自分としては、以下の記事はまさに「そうそう!」だった。

lnコマンドって、たまに使うと2つのpathのどっちが[出発地]でどっちが[目的地]か、引数の順番を忘れることってありませんか?

http://d.hatena.ne.jp/naotube/20100708/p1

今回は、ln コマンドの使い方を実践で学ぶことにする。

リンクの基礎

あるファイル(ディレクトリ)があって、そこへリンクを貼る、という行為は、「ファイル(ディレクトリ)へのポインタを持ったリンクファイルを作成する」ということ。出発地とそこからのポインタ(矢印)を合わせてリンクになる、すなわち

[目的地]<------[出発地]
        |-------------|
            リンク

のようになるわけだ。

この右から左へのリンクの流れは、ln でリンクを作成するときにもあてはまる。

[目的地] と [出発地] とを明示してシンボリックリンク作成

上記の基礎を踏まえたうえで、「ln -s [目的地] [出発地]」によって、[目的地] へのリンク = [出発地] を作成してみる。

[~] $ cd ~
[~] $ pwd
/home/okmount
[~] $ mkdir tmp
[~] $ cd tmp
[~/tmp] $ echo Hello,World! > hello.txt
[~/tmp] $ ln -s hello.txt mylink
[~/tmp] $ ls -l
合計 8
-rw-r--r-- 1 okmount group 13  9107:51 hello.txt
lrwxrwxrwx 1 okmount group  9  9107:51 mylink -> hello.txt
[~/tmp] $ cat mylink
Hello,World!

この際、次のように考えるとわかりやすい。

(1) hello.txt へのシンボリックリンクを貼りたいと思い、まず

ln -s hello.txt

と書く。

(2) リンクは、「出発地とそこからの矢印」であることを思い出し、

[hello.txt]<------[myhlink]
           |--------------|
             リンク

を実現するために、

ln -s hello.txt mylink

と、mylink を付け加える。これで、hello.txt へのリンク mylink を作成できた。

この考え方は、まさに「大事なものが先」(= リンクされる [目的地] をまず考える)ということだ。

[出発地] を指定せずにシンボリックリンク作成

[出発地] を指定せずにシンボリックリンク作成を作成する場合、リンクはカレントディレクトリに作成される。リンク名は [目的地] の名前と同じになる。

[~/tmp] $ cd ~
[~] $ pwd
/home/okmount
[~] $ ln -s ~/tmp/hello.txt
[~] $ ls -l hello.txt
lrwxrwxrwx 1 okmount group 30  9121:47 hello.txt -> /home/okmount/tmp/hello.txt
[~] $  cat hello.txt
Hello,World!

この場合、暗黙的に /home/okmount/hello.txt を [出発地] として指定したことになる。

失敗例

[~] $ ln -s loop
[~] $ ls -l loop
lrwxrwxrwx 1 okmount group  4  9107:38 loop -> loop
[~] $ cat loop
cat: loop: シンボリックリンクの階層が多すぎます

[出発地] と [目的地] にまったく同じパス /home/okmount/loop を指定したことになるので、リンクがループした。