lnコマンドは、ディレクトリやファイルへのリンクを登録するコマンドだ。
Linuxでは、リンクを「ハードリンク」と「シンボリックリンク」に分けて考える。
とても使用頻度が高く、重要なコマンドのひとつだ。
ぜひ、この機会に把握してほしい。
目次
- 1 lnコマンドの詳細
- 2 lnコマンドのオプションたち
- 2.1 -sオプション(--symbolicオプション):シンボリックリンクを作成する
- 2.2 -fオプション(--forceオプション):すでに登録名が登録されるものであった場合、登録内容を上書き登録する
- 2.3 -iオプション(--interactiveオプション):すでに登録名が登録されるものであった場合、登録内容を上書き登録するか確認する問い合わせがある。
- 2.4 -vオプション(--verboseオプション):リンクを登録する際に、登録する登録名とリンク先を表示する
- 2.5 -b:すでに登録名が登録されるものであった場合、元々のリンクをバックアップし新規にリンクを登録する
- 2.6 --backup[=CONTROL]オプション:すでに登録名が登録されるものであった場合、元々のリンクをCONTROLで指定された方法でバックアップし新規にリンクを登録する。
- 2.7 -S[ SUFFIX]オプション(--suffix=[SUFFIX]オプション):バックアップした登録名を元々の登録名の後ろにSUFFIXで設定された文字で設定する。
- 2.8 -d(-F,--directory):システムのすべての権限を持つスーパーユーザーにディレクトリへのリンクを許可する。
- 2.9 -Pオプション,(--physicalオプション):シンボリックリンクに対するハードリンクを登録する。
- 2.10 -Lオプション,(--logicalオプション):シンボリックリンクで参照されているリンク先へのハードリンクを設定する
- 3 ディレクトリの指定
- 4 関連項目
lnコマンドの詳細
lnコマンドでリンクを作成するのは次の通りだ。
$ ln リンク元 登録名
例えば、testディレクトリの中のdata01.datのリンクをd01という名前で作成する場合は、次のコマンドだ。
$ ln test/data01.dat d01
testディレクトリの中のdata01.datへのリンクがd01という名前で作成された。
lsコマンドで確認してみよう。
$ ls -l d01
今度は実際に内容を確認してみよう。
まずはリンク元のファイル内容を次のコマンドで表示してみよう。
$ cat test/data01.dat
次に新たに登録したリンクでファイル内容を次のコマンドで表示してみよう。
$ cat d01
どちらも同じものが表示されている。
元ファイルがない場合は、エラーが表示される。
次のコマンドで試してみよう。
$ ln test/data100.dat dmy
元ファイルtestディレクトリ内のdata100.datファイルは存在しないのでエラーが表示された。
上記のコマンドを試すなら次のコマンドを実行すれば動作を確認できる。
mkdir test echo TestFile012345 > test/data01.dat ln test/data01.dat d01 ls -l d01 cat test/data01.dat cat d01 ln test/data100.dat dmy |
lnコマンドのオプションたち
詳細は後で説明するが、まずは一覧で見ていこう。
-sオプション(--symbolicオプション)
シンボリックリンクを作成する。
-fオプション(--forceオプション)
すでに登録名が登録されるものであった場合、登録内容を上書き登録する。
-iオプション(--interactiveオプション)
すでに登録名が登録されるものであった場合、登録内容を上書き登録するか確認する問い合わせがある。
-vオプション(--verboseオプション)
リンクを登録する際に、登録する登録名とリンク先を表示する。
-bオプション
すでに登録名が登録されるものであった場合、元々のリンクをバックアップし新規にリンクを登録する。
--backup[=CONTROL] オプション
すでに登録名が登録されるものであった場合、元々のリンクをCONTROLで指定された方法でバックアップし新規にリンクを登録する。
-S[ SUFFIX] オプション(--suffix=[SUFFIX] オプション)
バックアップした登録名を元々の登録名の後ろにSUFFIXで設定された文字で設定する。
-dオプション(-F,--directoryオプション)
システムのすべての権限を持つスーパーユーザーにディレクトリへのリンクを許可する。
では詳細を見ていこう。
-sオプション(--symbolicオプション):シンボリックリンクを作成する
リンクには2通りのリンクがあり、オプションを付けなければ「ハードリンク」となる。
このオプションを設定することで「シンボリックリンク」になる。
シンボリックリンクを作成する場合は、次のコマンドだ。
$ ln -s リンク元 登録名
例えば、testディレクトリの中のdata01.datのシンボリックリンクをd02symbolという名前で作成する場合は、次のコマンドだ。
$ ln -s test/data01.dat d02symbol
testディレクトリの中のdata01.datへのリンクがd02symbolという名前で作成された。
lsコマンドで確認してみよう。
$ ls -l d02symbol
オプションなしの時のようにファイル名だけではなく、参照先も示した形でd02symbol -> test/data01.datのような表示になっている。
また、ファイルの属性もlrwxrwxrwxと1文字目がlになっている。
シンボリックリンクをlnコマンドで表示した場合はこのような表示になる。
実際に内容を新たに登録したリンクで次のコマンドで表示してみよう。
$ cat d02symbol
元ファイルと同じものが表示されている。
ln -s test/data01.dat d02symbol ls -l d02symbol cat d02symbol |
-fオプション(--forceオプション):すでに登録名が登録されるものであった場合、登録内容を上書き登録する
すでに登録されているものと同じ名前でリンクを登録しようとする時は、エラーが表示される。
次のコマンドでエラーメッセージを確認しよう。
$ ln d01 test/data02.dat
d01はすでに登録されているというエラーが表示される。
-fオプションではすでに登録されている名称と同名の場合、登録内容を上書き登録することもできる。
その時に使うオプションで書式は次の通りだ。
$ ln -f リンク元 登録名
現在、d01はtestディレクトリ内のdata01.datへのリンクとして登録されている。これをtestディレクトリ内のdata02.datへのリンクとして同名で登録するには次のコマンドだ。
$ ln -f test/data02.dat d01
エラーメッセージが表示されずに登録が上書きされた。
lsコマンドで確認してみよう。
$ ls -l d01
d01はtestディレクトリ内のdata02.datへのリンクとして上書き登録された。
-fオプションはエラーを表示しなくするオプションに見えるが、存在しないファイルへリンクしようとした時のエラーメッセージは表示する。登録名がすでに存在する時のエラーメッセージだけを表示しなくするオプションだ。
echo TestFile543210 > test/data02.dat ln test/data02.dat d01 ln -f test/data02.dat d01 ls -l d01 |
-iオプション(--interactiveオプション):すでに登録名が登録されるものであった場合、登録内容を上書き登録するか確認する問い合わせがある。
-fオプションのように強制的に上書き登録するが、その前に確認があると安心だ。上書きするかY(Yes)またはN(No)での確認を表示するオプションで書式は次の通りだ。
$ ln -i リンク元 登録名
現在、d01はtestディレクトリ内のdata02.datへのリンクとして登録されている。これをtestディレクトリ内のdata01.datへのリンクとして同名で登録するには次のコマンドだ。
$ ln -i test/data01.dat d01
上書きするかの確認が表示された。yキーを押して、上書きしよう。
ln -i test/data01.dat d01
強制的に上書き登録する-fオプションと併用してみると、オプションの入力順で動作が変わるので注意が必要だ。
次のコマンドでは-fオプションのみが設定された場合の動作になる。
$ ln -i -f リンク元 登録名
次のコマンドでも同様に-fオプションが設定された動作になる。
$ ln -if リンク元 登録名
次のコマンドでは-iオプションのみが設定された場合の動作になる。
$ ln -f -i リンク元 登録名
次のコマンドでも同様に-iオプションが設定された動作になる。
$ ln -fi リンク元 登録名
つまり、後ろで設定されたオプションが優先される。
混乱の元なので、-fオプションと-iオプションは同時に使わないようにしよう。
-vオプション(--verboseオプション):リンクを登録する際に、登録する登録名とリンク先を表示する
リンクを登録したときに、登録名とリンク先が正しく登録されたかを表示するオプションで、書式は次の通りだ。
$ ln -v リンク元 登録名
testディレクトリの中のdata03.datのリンクをd03という名前で確認しながら作成する場合は、次のコマンドだ。
$ ln -v test/data03.dat d03
testディレクトリの中のdata03.datへのリンクがd03という名前で作成されていることがわかる。
echo TestFile333 > test/data03.dat ln -v test/data03.dat d03 |
-b:すでに登録名が登録されるものであった場合、元々のリンクをバックアップし新規にリンクを登録する
すでに登録されているものと同じ名前でリンクを登録する時に、元々の登録内容をバックアップするオプションで書式は次の通りだ。
$ ln -b リンク元 登録名
testディレクトリの中のdata03.datのリンクをすでに登録されているd01という名前でバックアップしながら作成する場合は、次のコマンドだ。
$ ln -b test/data03.dat d01
d01の登録内容が更新され、今までのd01はバックアップされた。
バックアップしたものは、標準であれば元の登録名の後ろに「~」が付く。
確認してみよう。
$ ls -l d01*
上書き登録されたd01と登録がバックアップされたd01~が表示されている。
ln -b test/data03.dat d01 ls -l d01* |
--backup[=CONTROL]オプション:すでに登録名が登録されるものであった場合、元々のリンクをCONTROLで指定された方法でバックアップし新規にリンクを登録する。
-bではできない、バックアップ時の細かな設定を行うオプションで書式は次の通りだ。
$ ln --backup=CONTROL リンク元 登録名
CONTROLの箇所に入るパラメータは次の通りだ。
noneまたはoff
バックアップを作成しない。
バックアップを明示的に作成せずtestディレクトリの中のdata02.datのリンクをd03として上書き登録する場合は次の通りだ。
$ ln --backup=none test/data02.dat d03
バックアップせず、d03のリンクは登録すでに登録されているエラーが表示された。
オプションなしで、すでにある登録名で上書き登録するのと同じ動作だ。
ln --backup=none test/data02.dat d03
numberedまたはt
バックアップした登録名を元々の登録名の後ろに番号付きで設定する。
バックアップをしたものを番号付きで作成し、testディレクトリの中のdata02.datのリンクをd03として上書き登録する場合は次の通りだ。
$ ln --backup=numbered test/data02.dat d03
d03のリンクが上書きされ、番号付きのバックアップが作成された。
次のコマンドで確認してみよう。
$ ls -l d03*
d03.~1~が新たに作成されている。これが番号付きでバックアップされたものだ。
ln --backup=none test/data02.dat d03 ls -l d03* |
番号付きでバックアップされたd03.~1~は隠し属性がつくため、GUI環境のファイルマネージャーでバックアップされたリンクを見ようとすると、初期設定では隠れている。
existingまたはnil
すでにバックアップした登録名に番号付きのものがあった場合は、元々の登録名の後ろに番号付きで設定する。
すでに番号付きでバックアップされた登録のあるd03にtestディレクトリの中のdata02.datのリンクを上書き登録する場合は次の通りだ。
$ ln --backup=existing test/data02.dat d03
d03のリンクが上書きされ、連番となった番号付きのバックアップが作成された。
次のコマンドで確認してみよう。
$ls -l d03*
d03.~2~が新たに作成されている。これが連番の番号付きバックアップされたものだ。
ちなみに番号付きバックアップされていないd01にこのオプションで上書きバックアップした場合はどうなるか、次のコマンドで確認してみよう。
$ ln --backup=existing test/data02.dat d01
次のコマンドで確認してみよう。
$ls -l d01*
d01.~1~は作成されていない。あくまでバックアップは~のみが付いた形となる。
ln --backup=existing test/data02.dat d03 ls -l d03* ln --backup=existing test/data02.dat d01 ls -l d01* |
ファイルごとのバックアップのポリシーがある場合は、このオプションを使うとよい。
バックアップの履歴をすべて残したい場合は、初めの上書き登録はnumberedまたはtで行う。
バックアップは直前の1回のみでよい場合は、初めの上書き登録は特に指定せずに行う。
どちらでも次からはexistingまたはnilで行う。
このようにすることで、初回だけオプションの設定を意識すれば、そのファイルに合わせたバックアップができる。
simpleまたはnever
バックアップした登録名を元々の登録名の後ろに「~」を設定する。
バックアップの中に番号が付いているものがあっても、番号付きにはせずに、必ず「~」とする。
すでに番号付きでバックアップされた登録のあるd03に番号なしのバックアップを作成しつつtestディレクトリの中のdata02.datのリンクを上書き登録する場合は次の通りだ。
$ ln --backup=simple test/data02.dat d03
次のコマンドで確認してみよう。
$ ls -l d03*
d03~が新たに作成された。
しかし、その状態になった後に、番号付きのバックアップが残っている場合では、連番の設定が解除されるのではなく、existingまたはnilのパラメータを設定すれば、残っている最後の番号からの連番になる。
ln --backup= simple test/data02.dat d03 ls -l d03* |
-S[ SUFFIX]オプション(--suffix=[SUFFIX]オプション):バックアップした登録名を元々の登録名の後ろにSUFFIXで設定された文字で設定する。
-bオプションでバックアップに付く~は、Linuxのシステム環境変数SIMPLE_BACKUP_SUFFIXで指定されているもので、初期設定ではSIMPLE_BACKUP_SUFFIXは~になっている。
この設定ではなく、任意のものを使いたい場合に設定するオプションで、設定したい文字は次の書式の通り、SUFFIXに設定する。
$ ln -S バックアップに付く文字 リンク元 登録名
SUFFIXはディレクトリとして意味のある*、/などの一部の記号文字は使えないが、長いアルファベットの単語などの文字列でも指定できる。
すでに登録されているd02に、バックアップの文字を@として、testディレクトリの中のdata02.datのリンクを上書き登録する場合は次の通りだ。
$ ln -S @ test/data02.dat d02
次のコマンドで確認してみよう。
$ ls -l d02*
@付きのバックアップが作成された。
しかし、番号付きバックアップが存在している場合は、@2@のようなファイル名になるのではなく、--backup=existingのオプションが設定された時と同じく、~での連番のバックアップが作成される。
ln test/data01.dat d02 ln -S @ test/data02.dat d02 ls -l d02* |
-d(-F,--directory):システムのすべての権限を持つスーパーユーザーにディレクトリへのリンクを許可する。
ディレクトリへのハードリンクはシステムを不安定にする要因にもなるので、一般ユーザではできない。
すべての権限を持つスーパーユーザーでもリンクの設定ができない場合がある。その場合に使うオプションだ。
今操作しているのがスーパーユーザーのアカウントだとして、どんな場合でもどのディレクトリへのリンクを設定する設定するには次の書式だ。
$ ln -d リンク元 登録名
Linuxのディストリビューションによっては、スーパーユーザーがこのオプションを指定してもディレクトリへのハードリンクの設定ができないことがある。
ハードリンクではなく、シンボリックリンクであれば誰でもディレクトリに対してのリンクができる。
-Pオプション,(--physicalオプション):シンボリックリンクに対するハードリンクを登録する。
オプションを設定せずにlnコマンドを実行すればハードリンクになる。
しかし、シンボリックリンク自体へオプションなしでリンクを設定すると、自動でシンボリックリンクになる。
もしも、シンボリックリンクに対して、シンボリックリンクではなく、ハードリンクを設定したい場合に利用するコマンドで書式は次の通りだ。
$ ln -P リンク元 登録名
testディレクトリの中のs1で登録されているシンボリックリンクにh1としてハードリンクを登録する場合は次の通りだ。
$ ln -P test/s1 test/h1
確認してみよう
$ ls -l test/h1
h1がs1同様、read.meを参照するシンボリックリンクとして登録されている。
内容も確認してみよう。
$ cat test/h1
testディレクトリ内のh1はs1同様、testディレクトリ内のreadme.txtの内容が表示された。
echo SimpleTest > test/readme.txt ln -s readme.dat test/s1 ln -P test/s1 test/h1 ls -l test/h1 cat h1 |
-Lオプション,(--logicalオプション):シンボリックリンクで参照されているリンク先へのハードリンクを設定する
シンボリックリンクへのハードリンクではなく、シンボリックリンク先を辿り、その元ファイルへのハードリンクを登録するコマンドで、書式は次の通りだ。
$ ln -L リンク元 登録名
testディレクトリの中のs1で登録されているシンボリックリンクにh2としてハードリンクを登録する場合は次の通りだ。
$ ln -L test/s1 test/h2
確認してみよう。
$ ls -l test/h2
h2が登録されている。
内容も確認してみよう。
$ cat test/h2
testディレクトリ内のs1のリンク先の内容が表示された。
誤ってリンク元がハードリンクを指定しても、元ファイルへのリンクとなる。
リンク元がディレクトリに対するシンボリックリンクだった場合は、ディレクトリへのハードリンクが作成できないエラーとなる。
リンク元が更にリンクを参照している場合でも最終的なファイルを辿り、大元のファイルへのハードリンクとなる。
-Pオプションと動作結果が同じなのだが、-Pオプションはシンボリックリンクへのハードリンク、-Lオプションはリンクの大元のファイルへのハードリンクの登録という違いがある。
ln -L test/s1 test/h2 ls -l test/h2 cat test/h2 |
ディレクトリの指定
リンク元、登録名ともに任意のディレクトリ内のファイルを指定する場合、注意しなければならない点がある。
登録名にディレクトリが指定されていると、リンク元も登録名のディレクトリ配下と認識される。
$ ln DirA/File1.dat DirB/L1
上記の例では、DirBディレクトリの中にL1という名前で、DirBディレクトリ内のDirAディレクトリ内のFile1.datへのリンクとなる。
混乱しやすい指定なので注意しよう。
まとめ
コマンドのオプションは、大きいところでは-sオプションがシンボリックリンクを作るものということが重要だ。このオプションを最優先で覚えよう。
また、バックアップ関連の-bやバックアップファイルを操作する-Sというように分類して把握すればわかりやすいだろう。
リンクの設定はLinuxシステムでは切っても切れないものだ。lnコマンドはLinuxを使いこなすうえでも、ぜひ覚えておいてほしいコマンドだ。
関連項目
ls
ファイルやディレクトリの一覧を表示する。
stat
ファイルの情報を表示する。
cat
ファイルの内容を表示する。
mount
ハードディスクなど、外部の記憶装置をコンピュータが認識できるようにする。
「AからBへのリンク(つまり、AをクリックするとBへ飛ぶ)」の場合、Aをリンク元、Bをリンク先、と言うと思いますが、この記事ではリンク元となっています。間違いではありませんか?
ご愛読ありがとうございます。
lnコマンドの場合、オリジナルファイルやオリジナルフォルダのことをソース元と言います。
確かにHTMLのリンクではリンク元(参照元)リンク先(参照先)という呼び方をしますので混乱される方もいらっしゃるかもしれませんね。