lnコマンドはハードリンクやシンボリックリンクを作成するのによく利用されます。また、シンボリックリンクはLinux上でとても重要な概念のひとつです。
シンボリックリンクは、例えば、ファイルのコピーを作成するよりファイルへのリンクを作成したほうが良い場面やディレクトリ参照の都合を良くする場面などに使われます。
lnコマンドとは
ファイルの間でリンクを作成します。リンクは2種類あります。
一つはハードリンクです。もう一つはシンボリックリンクです。
また、シンボリックリンクはソフトリンクとも呼ばれます。
ハードリンクとは
ハードリンクとは、ファイルに別名をつけることです。
ハードリンクは、リンクとオリジナル(リンク元)という区別はありません。
これは、Linuxでのファイルシステムの構造によるものです。
Linuxは、inodeと呼ばれるデータ構造で基本的なファイル情報(ファイルサイズ等)を管理しています。
ファイルにアクセスするとは、inodeにアクセスしていることなので、inodeがファイルであるといっても過言ではありません。
つまり、ハードリンクとは、このinodeを共有するということになります。
また、ファイルシステムは、inodeを指すリンクがすべて削除された場合に、ファイルの実体を削除します。つまり、このファイルの削除は一種の混乱を生み出すかもしれません。例えば、ディスクの空き容量を増やそうとしてファイルを削除しても、ハードリンクをすべて削除していないため、ディスク容量が増えないという状況ができます。
ディレクトリに対してのハードリンクは、基本的に使うことができません。そして、ハードリンクが使われる場面は限定的で、ほとんど使われません。そのため、リンクを使う場合は基本的にシンボリックリンクを利用したほうがよいでしょう。
シンボリックリンクとは
ソフトリンクとも呼ばれます。シンボリックリンクは特別なファイルタイプです。シンボリックリンクのファイルは名前によって、別のファイルを参照しています。
例えば、/bin/lnという絶対パスの名前を指すシンボリックリンクのファイルを作成した場合、/bin/lnという絶対パスを参照するファイルが出来上がり、lnという相対パスの名前を指すシンボリックリンクを作成した場合、lnという相対パスを参照するファイルが出来上がります。
何かの操作を行う場合にシンボリックリンクファイルを選択したとき、その操作の対象はシンボリックリンクファイルが参照しているファイルになります。
しかし、ファイルを削除する(rmコマンド)やファイル名を変更する(mvコマンド)などの操作はシンボリックリンクファイル自体が操作の対象になります。
シンボリックリンクは、Windowsのショートカットに近い概念です。また、シンボリックリンクファイルの参照元ファイルを削除してから、シンボリックリンクファイルを開こうとするとその参照元ファイルの名前が作成されない限り、ファイルを開くのに失敗します。
lnコマンドの構文
1 2 |
ln [オプション]… リンク元ファイル リンクファイル名 ln [オプション]… リンク元ファイル… リンクファイルを入れるディレクトリ |
シンボリックリンクの場合、リンク元ファイルは、ディレクトリでも可能です。
また、シンボリックリンクのリンク元ファイルはあくまでも名前、つまりリンクの参照先なので、そのリンク元ファイル自体がなくても作成は可能です。
ハードリンクの作成
lnコマンドはオプションがない場合、ハードリンクを作成します。この例では、file.txtのハードリンクとしてfile_hardlink.txtを作成しました。
コマンド例
1 |
ln file.txt file_hardlink.txt |
確認
1 2 3 4 5 6 |
$ls -aigo |sed 1d 15601525 drwxrwxr-x 2 4096 7月 24 15:59 . 12847523 drwxr-xr-x 34 4096 7月 24 08:42 .. 15601616 -rw-rw-r-- 2 26 7月 24 09:04 file.txt 15601616 -rw-rw-r-- 2 26 7月 24 09:04 file_hardlink.txt 15601615 -rw-rw-r-- 1 0 7月 24 15:59 otherfile.txt |
ハードリンクは、ファイル情報を管理するinodeを共有します。
inodeはファイルごとに一意の番号が割り振られます。inodeの番号が同じということは、それは同じファイルということになります。
inodeは、lsコマンドのiオプションで確認することができます。一番左にある8桁の番号がinodeの番号になります。この例では「15601616」という番号が2つあることが確認できます。これは、同じファイルを参照しているということになります。
シンボリックリンクの作成
(-sオプション)
lnコマンドの-sオプションでシンボリックリンクのファイルを作成することができます。この例では、file.txtを参照するfile_symlink.txtのファイルを作成しました。
コマンド例
1 |
ln -s file.txt file_symlink.txt |
確認
1 2 3 4 5 6 7 |
$ls -aigo |sed 1d 15601525 drwxrwxr-x 2 4096 7月 24 16:13 . 12847523 drwxr-xr-x 34 4096 7月 24 08:42 .. 15601616 -rw-rw-r-- 2 26 7月 24 09:04 file.txt 15601616 -rw-rw-r-- 2 26 7月 24 09:04 file_hardlink.txt 15601617 lrwxrwxrwx 1 8 7月 24 16:13 file_symlink.txt -> file.txt 15601615 -rw-rw-r-- 1 0 7月 24 15:59 otherfile.txt |
シンボリックリンクを絶対パスで作成する場合、ファイルの絶対パスはreadlinkコマンドの-fオプションで取得することができます。
コマンド例と実行結果
1 2 |
$readlink -f file.txt /home/ubuntu/test_ln/file.txt |
これを利用して、lnコマンドを使えば、絶対パスでのシンボリックリンクファイルを作成することができます。
コマンド例
1 |
ln -s $(readlink -f file.txt) file_abs_symlink.txt |
確認
1 2 3 4 5 6 7 8 |
$ls -aigo |sed 1d 15601525 drwxrwxr-x 2 4096 7月 24 16:23 . 12847523 drwxr-xr-x 34 4096 7月 24 08:42 .. 15601616 -rw-rw-r-- 2 26 7月 24 09:04 file.txt 15601618 lrwxrwxrwx 1 29 7月 24 16:23 file_abs_symlink.txt -> /home/ubuntu/test_ln/file.txt 15601616 -rw-rw-r-- 2 26 7月 24 09:04 file_hardlink.txt 15601617 lrwxrwxrwx 1 8 7月 24 16:13 file_symlink.txt -> file.txt 15601615 -rw-rw-r-- 1 0 7月 24 15:59 otherfile.txt |
また、「$()」はコマンド置換の方法の一つです。「$(readlink -f file.txt)」がreadlinkコマンドの出力、つまり「/home/ubuntu/test_ln/file.txt」に置き換えられます。
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版