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 9月 1日 07:51 hello.txt lrwxrwxrwx 1 okmount group 9 9月 1日 07: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 9月 1日 21: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 9月 1日 07:38 loop -> loop [~] $ cat loop cat: loop: シンボリックリンクの階層が多すぎます
[出発地] と [目的地] にまったく同じパス /home/okmount/loop を指定したことになるので、リンクがループした。