Overview
ln コマンドは、ファイル間のリンクを作成します。
ln コマンドの書式
ln [OPTION]... [-T] TARGET LINK_NAME
ln [OPTION]... TARGET
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... -t DIRECTORY TARGET...
- 1 番目の形式では、TARGET の名前を LINK_NAME としてリンクを作成します。
- 2 番目の形式では、現在のディレクトリに TARGET へのリンクを作成します。
- 3 番目および 4 番目の形式では、それぞれの TARGET に対して DIRECTORY にリンクを作成します。
- デフォルトでは、ハードリンクを作成し、
--symbolic
オプションを使用してシンボリックリンクを作成します。 - デフォルトでは、各目的地(新しいリンクの名前)は既に存在していてはいけません。
- ハードリンクを作成する場合、各 TARGET が存在している必要があります。シンボリックリンクは任意のテキストを保持できます。後で解決されると、相対リンクはその親ディレクトリに関連して解釈されます。
ln コマンドの主なオプション
オプション | 説明 |
---|---|
--backup [=CONTROL] | 既存の各リンク元ファイルにバックアップを作成します。 |
-b | --backup と同様ですが、引数を受け取りません。 |
-d , -F , --directory | スーパーユーザーがディレクトリのハードリンクを試みることを許可します。 (注: スーパーユーザーでも、システムの制限により失敗する可能性が高いです) |
-f , --force | 既存のリンク先ファイルを強制的に削除します。 |
-i , --interactive | リンク先ファイルを削除するかどうかをプロンプトで確認します。 |
-L , --logical | シンボリックリンクである TARGET を参照します。 |
-n , --no-dereference | LINK_NAME がディレクトリへのシンボリックリンクである場合、それを通常のファイルとして扱います。 |
-P , --physical | シンボリックリンクに直接ハードリンクを作成します。 |
-r , --relative | リンクの場所に対して相対的なシンボリックリンクを作成します。 |
-s , --symbolic | ハードリンクの代わりにシンボリックリンクを作成します。 |
-S , --suffix =SUFFIX | 通常のバックアップのサフィックスをオーバーライドします。 |
-t , --target-directory =DIRECTORY | リンクを作成するディレクトリを指定します。 |
-T , --no-target-directory | 常に LINK_NAME を通常のファイルとして扱います。 |
-v , --verbose | 各リンクされたファイルの名前を表示します。 |
--help | ヘルプを表示して終了します。 |
--version | バージョン情報を出力して終了します。 |
バックアップの接尾辞は、--suffix
または SIMPLE_BACKUP_SUFFIX で設定されていない限り、~ です。 バージョン管理方法は、--backup
オプションまたは VERSION_CONTROL 環境変数を通じて選択できます。以下にその値を示します。
値 | 説明 |
---|---|
none , off | バックアップを作成しません。–backup が指定されていても同様です。 |
numbered , t | 番号付きのバックアップを作成します。 |
existing , nil | 番号付きのバックアップが存在する場合は番号付き、それ以外は単純なバックアップを作成します。 |
simple , never | 常に単純なバックアップを作成します。 |
-s
を使用すると、-L
と -P
は無視されます。それ以外の場合、指定された最後のオプションが TARGET がシンボリックリンクの場合の動作を制御し、デフォルトでは -P
になります。
概要
lnコマンドはハードリンクとシンボリックリンクを作成するコマンドです。
ハードリンク
ハードリンクとは
様々なサイトでハードリンクの解説をしていますが、自分なりの解釈で端的にいうと「ファイル名が異なるがファイルの内容が同一のファイル(inodeが同じ)を作っていて、且つコピーされたファイルのようにディスク容量を消費しない。また、リンクというより実体である」となります。また、デバイスやパーティション跨いだハードリンクは作成できません。詳細は以降の内容を参照して下さい。
シンボリックリンクと比べて便利そう?と思うところもありますが、Linuxを使う側からするとあまり使うことは無いかもしれません。実際、ここはハードリンクにしよう等と思ったこともありません。どちらかというとLinux OS内部で使っているケースがほとんどだと思います。この為、通常はシンボリックリンクを使うだけになり、どうしてもハードリンクでないと要件を満たせない場合にのみハードリンクが登場すると思います(ほぼないと思います)。
コマンド
書式は、”ln 実ファイル名 リンク名”となります。以降はファイルの例ですがディレクトリでも同じです。
[root@centos ~]# ln aaa bbb [root@centos ~]# ls -l aaa bbb -rw-r--r--. 2 root root 4 10月 29 20:24 aaa -rw-r--r--. 2 root root 4 10月 29 20:24 bbb
ハードリンクを削除した場合は実ファイルが残ります。
[root@centos ~]# rm -f bbb [root@centos ~]# ls -l aaa bbb ls: 'bbb' にアクセスできません: そのようなファイルやディレクトリはありません -rw-r--r--. 1 root root 4 10月 29 20:24 aaa
実ファイルを削除した場合はハードリンクが残り、ハードリンクにアクセス可能です。
[root@centos ~]# rm -f aaa [root@centos ~]# ls -l aaa bbb ls: 'aaa' にアクセスできません: そのようなファイルやディレクトリはありません -rw-r--r--. 1 root root 4 10月 29 20:24 bbb [root@centos ~]# cat bbb cat: bbb: そのようなファイルやディレクトリはありません
この為、コピーされたファイルのように見えますが、そうではありません。コピーのように名前の異なる実ファイルではありますが、ファイルの中身はどのファイルで更新しても同期されます。また、作成したハードリンクを元にハードリンクを作成することもできます。元のファイルaaaは削除後は関係なくなります。
[root@centos ~]# cat aaa aaa [root@centos ~]# cat aaa aaa [root@centos ~]# echo "bbb" >> aaa [root@centos ~]# echo "ccc" >> bbb [root@centos ~]# cat aaa aaa bbb ccc [root@centos ~]# cat bbb aaa bbb ccc [root@centos ~]# rm -f aaa [root@centos ~]# ln bbb ccc [root@centos ~]# cat ccc aaa bbb ccc
この為、ハードリンクはシンボリックリンクのように実ファイルがlsで表示されません。代わりにアクセス権の後の数値(2、3の箇所)でリンクしているファイルが何個あるかがわかります。下記の例ではaaa,bbb,cccのハードリンクがあるので最終的に3になっています。
[root@centos ~]# ls -l bbb ccc -rw-r--r--. 2 root root 12 10月 29 20:31 bbb -rw-r--r--. 2 root root 12 10月 29 20:31 ccc [root@centos ~]# ln ccc aaa [root@centos ~]# ls -l aaa bbb ccc -rw-r--r--. 3 root root 12 10月 29 20:31 aaa -rw-r--r--. 3 root root 12 10月 29 20:31 bbb -rw-r--r--. 3 root root 12 10月 29 20:31 ccc
ハードリンクはあるファイルの内容が双方向に同期されたファイルと言えます。これはinode番号が同じ(一番左の値)ことに由来します。ハードリンクされたファイルを探すには、面倒ですがこのinodeが同じことを利用してfindコマンドで-inumオプションを使用し、探す必要があります。
[root@centos ~]# ls -l aaa bbb ccc
134782923 -rw-r--r--. 3 root root 12 10月 29 20:31 aaa
134782923 -rw-r--r--. 3 root root 12 10月 29 20:31 bbb
134782923 -rw-r--r--. 3 root root 12 10月 29 20:31 ccc
シンボリックリンク
シンボリックリンクとは
シンボリックリンクはハードリンクと異なり、パスでリンクされているだけですので、通常はシンボリックリンクのほうがシンプルで使い勝手が良いでしょう。
コマンド
書式は、”ln -s 実ファイル名 リンク名”となります。以降はファイルの例ですがディレクトリでも同じです。
[root@centos ~]# ln -s aaa bbb [root@centos ~]# ls -l aaa bbb -rw-r--r--. 1 root root 4 10月 29 20:15 aaa lrwxrwxrwx. 1 root root 3 10月 29 20:16 bbb -> aaa
シンボリックリンクを削除した場合は実ファイルが残ります。
[root@centos ~]# rm -f bbb [root@centos ~]# ls -l aaa bbb ls: 'bbb' にアクセスできません: そのようなファイルやディレクトリはありません -rw-r--r--. 1 root root 4 10月 29 20:15 aaa
実ファイルを削除した場合はシンボリックリンクが残りますがシンボリックリンクにアクセスできません。
[root@centos ~]# rm -f aaa [root@centos ~]# ls -l aaa bbb ls: 'aaa' にアクセスできません: そのようなファイルやディレクトリはありません lrwxrwxrwx. 1 root root 3 10月 29 20:19 bbb -> aaa [root@centos ~]# cat bbb cat: bbb: そのようなファイルやディレクトリはありません