この記事ではln
コマンドの基本的な使い方と例、オプションなどについて解説しています。
lnコマンド
ln
コマンドでは、指定したファイル・ディレクトリへのリンクを作成することができます。Windowsでいうところのショートカットを作成することができ、複数の場所から一つのファイルを参照、修正することができるようになります。
作成することができるリンクには2種類あり、シンボリックリンク
とハードリンク
があります。その2つについてはあとのほうでざっくりと解説していますが、シンボリックリンクのみディレクトリへのリンクを作成することができるので基本的にはこちらを使用することが多いかと思います。
-s オプションでシンボリックリンクを作成する
ln -s [リンク先] [リンク名]
でシンボリックリンクを作成することができます。ディレクトリへのリンクを作成するときにはこちらを使用します。
ファイルへのリンクを作成
# memo.txtというファイルを作成 $ echo "link test" > memo.txt # memo.txtへlinkという名前のリンクを作成する $ ln -s memo.txt link # リンクが作成できていることを確認 $ ls -l lrwxrwxrwx 1 ... link -> memo.txt -rw-r--r-- 1 ... memo.txt # リンクを開いてリンク先のファイルを参照する $ cat link link test
Windowsのショートカットと同じような動作になります。リンクだけ作成されるので大きなファイルや複数場所から参照するときに使います。
リンクファイルを作成してls -l
で表示するとリンク名 -> リンク先
という表示になります。リンク先はリンク作成時に指定したパスで表示されます。
また権限情報を表示している部分の先頭がl
となります。(ファイルは-
、ディレクトリはd
)
リンク先のファイル、またリンク先へのパスが変更されたときには作成したリンクは機能しなくなります。
# ファイル名変更 $ mv memo.txt _memo.txt total 4 lrwxrwxrwx 1 8 Nov 24 16:53 link -> memo.txt -rw-r--r-- 1 10 Nov 24 00:51 _memo.txt # リンクから参照することができなくなる $ cat link cat: link: No such file or directory # ファイル名を元に戻すと参照できるようになる $ mv _memo.txt memo.txt $ cat link link test
Raspberry Pi(Raspbian)だと、リンク先が参照できないときにはls
で表示したときにリンク名が赤く表示されます。
ディレクトリへのリンクを作成
作成の仕方やルールは上記と同じになります。
# dir1/dir2/を作成 $ mkdir -p dir1/dir2 # dir2へのリンクを作成 $ ln -s dir1/dir2/ link_dir # 移動 $ cd link_dir /link_dir $ pwd /home/user/link_dir # 実際は/home/user/dir1/dir2/ にいる
一つ注意が必要なのが、リンクを経由して移動すると現在ディレクトリもリンクを経由した状態になりますそのため、pwd
コマンドを実行すると、直接dir2
に移動した時と結果が異なりますので注意してください。
オプションなしでハードリンクを作成する
コチラはファイルへのリンク
のみ作成することができます。-s
オプションをつけないだけでOKです。
# リンクを作成 $ ln memo.txt hlink $ ls -og -rw-r--r-- 2 10 Nov 24 17:11 hlink -rw-r--r-- 2 10 Nov 24 17:11 memo.txt # ディレクトリへのハードリンクは作成できない $ mkdir hdir $ ln hdir/ hlink2 ln: hdir/: hard link not allowed for directory
ハードリンクにはls
したときにシンボリックリンクのように参照先ファイル名を表示してくれません(ファイルの場所を参照しているわけではないため)。また、ls
の左から2番目の数字が1つカウントアップされます。
ハードリンクで作成した場合は、リンク先のファイルを移動したり名前を変更・削除しても参照可能です。
# リンク先ファイルの名前を変更 $ mv memo.txt _memo.txt $ cat hlink link test # リンク経由でファイルを編集 $ echo "added line" >> hlink # リンク先ファイルも変更される $ cat _memo.txt link test added line # リンク先ファイルを削除 $ rm _memo.txt $ cat hlink link test added line # 消したファイルの内容を参照できる
シンボリックリンクではディレクトリ上のファイルの場所(シンボル)を参照していましたが、ハードリンクではリンク先の参照しているファイルの実体を参照するような形になるため、リンク先のファイル名を変更したり削除することができます。ファイルの実体を参照するリンクがすべて削除され、参照しているプロセスも無い場合に実体は削除(ディスク上の領域が使用可能になる)されるようです。
そのほかいろいろな利点や制約があるようですがあまり気にせずシンボリックリンクで私はリンクをいつも作成しています。。。(笑)
リンクを削除する
シンボリックリンク・ハードリンクともに削除するにはrm
コマンドまたはunlink
コマンドを使用しします。
$ ls link memo.txt $ rm link $ ls memo.txt
unlink
コマンドはリンクを削除するためだけのコマンドのように見えますが、普通に作成したファイルも削除できてしまうため注意が必要です。実際、ファイルはディスク上に存在するデータを参照する1つのハードリンクと同じなためです。
参考
以下のサイトの情報を引用・参考にしました。