連載
» 2016年05月30日 05時00分 UPDATE

Linux基本コマンドTips(16):【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「ln」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、シンボリックリンクを作成するための「ln」コマンドです。

lnコマンドとは?

 「ln」は、ファイルのリンクを作成するためのコマンドです。「ln ファイル名 リンク名」でハードリンクを作成できますが、「-s」オプションを使い、「ln -s ファイル名 リンク名」としてシンボリックリンクを作成する方が一般的です。


lnコマンドの書式

ln [オプション] ファイル名 リンク名

(ファイルのリンク(ハードリンクまたはシンボリックリンク)を作成する)

ln -s ファイル名 リンク名

(ファイルのシンボリックリンクを作成する)

ln -s ディレクトリ名 リンク名

(ディレクトリのシンボリックリンクを作成する)

ln -s ファイル1 ファイル2…… ディレクトリ

(指定したディレクトリの中にシンボリックリンクを作成する)

※[ ]は省略可能な引数を示しています



lnコマンドの主なオプション

 lnコマンドの主なオプションは次の通りです。

短いオプション 長いオプション 意味
-s --symbolic ハードリンクの代わりにシンボリックリンクを作成する
-d,-F --directory ディレクトリのハードリンクを作成する(スーパーユーザーのみ)
-f --force リンクファイルと同じ名前のファイルがあっても強制的に上書きする
-i --interactive 上書き前に確認する
-n --no-dereference リンクの作成場所として指定したディレクトリがシンボリックリンクだった場合、参照先にリンクを作るのではなく、シンボリックリンクそのものを置き換える(-fと組み合わせて使用)
-L --logical 対象がシンボリックリンクの場合リンクを巡る
-P --physical シンボリックリンク自体へのハードリンクを作成する
-r --relative 相対パスのシンボリックリンクを作成する
-T --no-target-directory リンク先を常に通常ファイルとして扱う
-t DIR --target-directory=DIR 指定したディレクトリにリンクを作成する(DIR部分はディレクトリ名)
-b --backup=方法 上書きされるファイルのバックアップを作成する(実行例2を参照)
[方法]:「numbered」または「t」の場合は番号の添え字、「simple」または「never」の場合はファイル名の末尾に「~」または「-S」オプションか環境変数で指定した文字を付けるシンプルなバックアップ(-bと同じ)、「existing」または「nil」の場合は既にあるファイルに従う(ない場合はsimpleと同じ)
-S 接尾辞 --suffix=接尾辞 バックアップファイルを作る際のファイル名末尾に付ける文字(無指定時は「~」1文字、または環境変数「SIMPLE_BACKUP_SUFFIX」に従う)
-v --verbose 経過を表示する


シンボリックリンクを作成する

 「ln -s」で、ファイルの“シンボリックリンク”を作成できます。シンボリックリンクは、いわばファイルの“別名”で、長いファイル名に別の名前を付けたり、パス名の指定が分かりにくい場所にあるファイルを扱いやすくしたりする(例:ディレクトリへのシンボリックリンク)場合に使います。

コマンド実行例

ln -s ファイル名 リンク名

(ファイルのシンボリックリンクを作成する)


 以下の実行例では、ファイル「mylist02.txt」に対し、「latest」という名前のシンボリックリンクを作成しています。この場合、テキストエディタで「latest」というファイルを編集したり、閲覧したりすることは、「mylist02.txt」を編集したり、閲覧したりすることと同じ操作結果になります。

$ ls -l
合計 8
-rw-rw-r--. 1 study study  65  5月 15 00:00 mylist01.txt
-rw-rw-r--. 1 study study 127  5月 17 00:00 mylist02.txt
「mylist01.txt」というファイルと「mylist02.txt」というファイルがある
$ ln -s mylist02.txt latest
「ln -s」で「mylist02.txt」に「latest」という名前のシンボリックリンクを作成する
$ ls -l
合計 8
lrwxrwxrwx. 1 study study  12  5月 18 19:39 latest -> mylist02.txt
-rw-rw-r--. 1 study study  65  5月 15 00:00 mylist01.txt
-rw-rw-r--. 1 study study 127  5月 17 00:00 mylist02.txt
「latest」というシンボリックリンクが作成された


バックアップファイルを作成する

 lnコマンドで既存のファイルと同じ名前のリンクを作成すると、ファイルが上書きされてしまいます。「-b」オプションを付けると、ファイル名の末尾に「~」という文字が付いたバックアップファイルが作成されます。なお、末尾の文字は「-S」オプションまたは環境変数「SIMPLE_BACKUP_SUFFIX」で変更できます。

コマンド実行例

ln -sb ファイル名 リンク名

(ファイルのシンボリックリンクを作成する。リンク名と同名のファイルがあった場合「リンク名~」という名前で保存される)


 以下の実行例では、「mylist03.txt」に「latest」という名前のシンボリックリンクを作成しています。

$ ls -l
合計 12
lrwxrwxrwx. 1 study study  12  5月 18 19:39 latest -> mylist02.txt
-rw-rw-r--. 1 study study  65  5月 15 00:00 mylist01.txt
-rw-rw-r--. 1 study study 127  5月 17 00:00 mylist02.txt
-rw-rw-r--. 1 study study 251  5月 18 19:52 mylist03.txt
ファイル「mylist01.txt」「mylist02.txt」「mylist03.txt」と、「mylist02.txt」へのシンボリックリンク「latest」がある
$ ln -sb mylist03.txt latest
「ln -sb」で「mylist03.txt」に「latest」という名前のシンボリックリンクを作成する
$ ls -l
合計 12
lrwxrwxrwx. 1 study study  12  5月 18 19:52 latest -> mylist03.txt
lrwxrwxrwx. 1 study study  12  5月 18 19:39 latest~ -> mylist02.txt
-rw-rw-r--. 1 study study  65  5月 15 00:00 mylist01.txt
-rw-rw-r--. 1 study study 127  5月 17 00:00 mylist02.txt
-rw-rw-r--. 1 study study 251  5月 18 19:52 mylist03.txt
「mylist03.txt」へのシンボリックリンク「latest」が作成された。もともと存在していた「mylist02.txt」へのシンボリックリンク「latest」は「latest~」という名前で残っている


パス付きのリンクを作成する

 リンクの参照先は、相対パスでも絶対パスでも指定できます。相対パスで指定した場合は、シンボリックリンクファイルがある場所からの相対パスとなります。既存ファイルへのリンクを作成する場合は、ファイル名の「補完機能」を活用するとよいでしょう。

$ cd	(ホームディレクトリへ移動)
$ mkdir backupdir	(backupdirというディレクトリを作る)
$ cd backupdir	(baskupdirへ移動)
$ ln -s ../.bashrc bashrc0518
親ディレクトリにある「.bashrc」へのシンボリックリンクを「bashrc0518」という名前で作成

 「ln -s」では、“存在しないファイル”へのリンクも作成できます。例えば、「外付けHDDをマウントしたときにだけ使えるシンボリックリンク」を作成することも可能です。



ディレクトリへのシンボリックリンクを作成する

 「ln -s」では、ディレクトリへのシンボリックリンクを作ることもできます。

コマンド実行例

ln -s ディレクトリ名 リンク名

(ディレクトリのシンボリックリンクを作成する)


 以下の実行例では「/usr/share/man/ja/」へのシンボリックリンク「mandir」を作成しています。例えば、「ls mandir」や「cd mandir」で「/usr/share/man/ja/」の内容を確認したり、「/usr/share/man/ja/」へ移動したりできます。

$ ln -s /usr/share/man/ja/ mandir
「/usr/share/man/ja/」というディレクトリのシンボリックリンク「mandir」を作成
$ ls /usr/share/man/ja/
man1  man2  man3  man4  man5  man6  man7  man8
$ ls mandir/
man1  man2  man3  man4  man5  man6  man7  man8
「ls mandir/」は「ls /usr/share/man/ja/」と同じ結果になる


ハードリンクとシンボリックリンクを使い分ける

 lnコマンドで「-s」オプションなしでリンクを作成すると、「ハードリンク」となります。シンボリックリンクがファイルの“別名”なら、ハードリンクはいわば“本名”です。どちらも本名なので両者は同等です。

コマンド実行例

ln ファイル名 リンク名

(ファイルのハードリンクを作成する)


 以下の実行例では、「mylist03.txt」に対して「newlist」というハードリンクを作成しています。

$ ln  mylist03.txt newlist
ファイル「mylist03.txt」に対して「newlist」というハードリンクを作成する
$ ls -l
合計 16
lrwxrwxrwx. 1 study study  12  5月 18 20:20 latest -> mylist03.txt
lrwxrwxrwx. 1 study study  12  5月 18 19:39 latest~ -> mylist02.txt
-rw-rw-r--. 1 study study  65  5月 15 00:00 mylist01.txt
-rw-rw-r--. 1 study study 127  5月 17 00:00 mylist02.txt
-rw-rw-r--. 2 study study 251  5月 18 19:52 mylist03.txt
-rw-rw-r--. 2 study study 251  5月 18 19:52 newlist
「mylist03.txt」と「newlist」は全く“同等”のファイル

 上記実行例の「mylist03.txt」と「newlist」を「stat」コマンドで見比べてみましょう。

$ stat mylist03.txt
  File: `mylist03.txt'
  Size: 251       	Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d	Inode: 8947952     Links: 2
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   study)   Gid: ( 1000/   study)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2016-05-18 19:52:04.245033001 +0900
Modify: 2016-05-18 19:52:04.246033001 +0900
Change: 2016-05-18 20:22:55.401033001 +0900
 Birth: -
「mylist03.txt」を「stat」コマンドで確認
$ stat newlist 
  File: `newlist'
  Size: 251       	Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d	Inode: 8947952     Links: 2
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   study)   Gid: ( 1000/   study)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2016-05-18 19:52:04.245033001 +0900
Modify: 2016-05-18 19:52:04.246033001 +0900
Change: 2016-05-18 20:22:55.401033001 +0900
 Birth: -
「newlist」を「stat」コマンドで確認

 どちらにも「Links: 2」(4行目)とあるので、ハードリンクが2つ存在していることが分かります。また、どちらも「Inode: 8947952」(4行目)であることから、実体が同じであることも分かります。逆に言えば、ここを見ない限り、両者が同じものであるということは分かりません。当然ですが、タイムスタンプも全く同じになるので“どちらを先に作ったか”といったことも分かりません。

 シンボリックリンクの場合は、ファイルの操作としては同じように扱うことができるけれど、「どのファイルへのリンクなのかが分かる」「シンボリックリンクであることが、ln -lですぐに分かる」というのがポイントです。

 つまり、管理上“別の名前で参照している”ということを分かりやすくしておきたい場合はシンボリックリンク、区別をしたくないときはハードリンク、という使い分けができます(※)。

※ハードリンクには、「(1)同じパーティション内にないといけない」「(2)ディレクリへのハードリンクはスーパーユーザーにしか作れない(さらに「-d」オプションが必要)」という制限があります。



 なお、「rm mylist03.txt」コマンドで「mylist03.txt」を削除した場合、「mylist03.txt」へのシンボリックリンク「latest」は“リンク先なし”となり、ハードリンク「newlist」はそのまま残ります(※)。

※「stat」コマンドで確認できる“リンク数(Links)”は「1」になります。「newlist」を削除するとリンク数が「0」になり、ファイルが削除されます。




筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。