りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

ln - 指定したファイルのショートカット(リンク)を作成する

f:id:ibuquicallig:20191124174236p:plain

この記事では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つのハードリンクと同じなためです。

参考

以下のサイトの情報を引用・参考にしました。