lnコマンドについて詳しくまとめました 【Linuxコマンド集】

lnコマンド
  • このエントリーをはてなブックマークに追加
  • Pocket

lnコマンドは、ディレクトリやファイルへのリンクを登録するコマンドだ。

Linuxでは、リンクを「ハードリンク」と「シンボリックリンク」に分けて考える。

とても使用頻度が高く、重要なコマンドのひとつだ。

ぜひ、この機会に把握してほしい。

 

目次

lnコマンドの詳細

lnコマンドでリンクを作成するのは次の通りだ。

$ ln リンク元 登録名

例えば、testディレクトリの中のdata01.datのリンクをd01という名前で作成する場合は、次のコマンドだ。

$ ln test/data01.dat d01

lnコマンド

testディレクトリの中のdata01.datへのリンクがd01という名前で作成された。

lsコマンドで確認してみよう。

$ ls -l d01

lnコマンド

今度は実際に内容を確認してみよう。

まずはリンク元のファイル内容を次のコマンドで表示してみよう。

$ cat test/data01.dat

lnコマンド

次に新たに登録したリンクでファイル内容を次のコマンドで表示してみよう。

$ cat d01

lnコマンド

どちらも同じものが表示されている。

元ファイルがない場合は、エラーが表示される。

次のコマンドで試してみよう。

$ ln test/data100.dat dmy

lnコマンド

元ファイル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

lnコマンド

testディレクトリの中のdata01.datへのリンクがd02symbolという名前で作成された。

lsコマンドで確認してみよう。

$ ls -l d02symbol

lnコマンド

オプションなしの時のようにファイル名だけではなく、参照先も示した形でd02symbol -> test/data01.datのような表示になっている。

また、ファイルの属性もlrwxrwxrwxと1文字目がlになっている。

シンボリックリンクをlnコマンドで表示した場合はこのような表示になる。

実際に内容を新たに登録したリンクで次のコマンドで表示してみよう。

$ cat d02symbol

lnコマンド

元ファイルと同じものが表示されている。

ln -s test/data01.dat d02symbol
ls -l d02symbol
cat d02symbol

 

-fオプション(--forceオプション):すでに登録名が登録されるものであった場合、登録内容を上書き登録する

すでに登録されているものと同じ名前でリンクを登録しようとする時は、エラーが表示される。

次のコマンドでエラーメッセージを確認しよう。

$ ln d01 test/data02.dat

lnコマンド

d01はすでに登録されているというエラーが表示される。

-fオプションではすでに登録されている名称と同名の場合、登録内容を上書き登録することもできる。

その時に使うオプションで書式は次の通りだ。

$ ln -f リンク元 登録名

現在、d01はtestディレクトリ内のdata01.datへのリンクとして登録されている。これをtestディレクトリ内のdata02.datへのリンクとして同名で登録するには次のコマンドだ。

$ ln -f test/data02.dat d01

lnコマンド

エラーメッセージが表示されずに登録が上書きされた。

lsコマンドで確認してみよう。

$ ls -l d01

lnコマンド

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

lnコマンド

上書きするかの確認が表示された。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

lnコマンド

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

lnコマンド

d01の登録内容が更新され、今までのd01はバックアップされた。

バックアップしたものは、標準であれば元の登録名の後ろに「~」が付く。

確認してみよう。

$ ls -l d01*

lnコマンド

上書き登録された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

lnコマンド

バックアップせず、d03のリンクは登録すでに登録されているエラーが表示された。

オプションなしで、すでにある登録名で上書き登録するのと同じ動作だ。

ln --backup=none test/data02.dat d03

numberedまたはt

バックアップした登録名を元々の登録名の後ろに番号付きで設定する。

バックアップをしたものを番号付きで作成し、testディレクトリの中のdata02.datのリンクをd03として上書き登録する場合は次の通りだ。

$ ln --backup=numbered test/data02.dat d03

lnコマンド

d03のリンクが上書きされ、番号付きのバックアップが作成された。

次のコマンドで確認してみよう。

$ ls -l d03*

lnコマンド

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

lnコマンド

d03のリンクが上書きされ、連番となった番号付きのバックアップが作成された。

次のコマンドで確認してみよう。

$ls -l d03*

lnコマンド

d03.~2~が新たに作成されている。これが連番の番号付きバックアップされたものだ。

ちなみに番号付きバックアップされていないd01にこのオプションで上書きバックアップした場合はどうなるか、次のコマンドで確認してみよう。

$ ln --backup=existing test/data02.dat d01

lnコマンド

次のコマンドで確認してみよう。

$ls -l d01*

lnコマンド

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

lnコマンド

次のコマンドで確認してみよう。

$ ls -l d03*

lnコマンド

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

lnコマンド

次のコマンドで確認してみよう。

$ ls -l d02*

lnコマンド

@付きのバックアップが作成された。

しかし、番号付きバックアップが存在している場合は、@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

lnコマンド

確認してみよう

$ ls -l test/h1

lnコマンド

h1がs1同様、read.meを参照するシンボリックリンクとして登録されている。

内容も確認してみよう。

$ cat test/h1

lnコマンド

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

lnコマンド

確認してみよう。

$ ls -l test/h2

lnコマンド

h2が登録されている。

内容も確認してみよう。

$ cat test/h2

lnコマンド

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

ハードディスクなど、外部の記憶装置をコンピュータが認識できるようにする。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*