[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2 ln: ファイル間のリンクを作成する

ln はファイル間のリンクを作成する。デフォルトではハードリンクを作成するが、 ‘-s’ オプションを指定すると、シンボリックリンク (soft linkとも言う) を作ることになる。

書式:

 
ln [option]… [-T] target linkname
ln [option]… target
ln [option]… targetdirectory
ln [option]… -t directory target

通常 ln は存在するファイルを削除しない。 既存のファイルを無条件で削除するには、‘--force’ (‘-f’) オプションを使う。 また、ユーザに問い合わせた上で削除するには、‘--interactive’ (‘-i’) オプションを使う。既存のファイルを、名前を変更して残すには、‘--backup’ (‘-b’) オプションを使用する。(訳注: ここで述べているのは、 存在するファイルの名前をリンクファイル名として使う場合の話である。)

ハードリンク (hard link) というのは、存在するファイルが持つ別の名前である。 だから、リンクとオリジナルは、区別ができない。専門的な言い方をすると、両者は同じ inode を共有するものである。inode には、ファイルに関する情報がすべて含まれているので、 全くのところ、inode こそファイルであると言っても、過言ではないほどだ。 たいていのシステムでは、ディレクトリに対するハードリンクの作成は禁じられている。 許可されているシステムでも、それができるのは、スーパーユーザだけである (その場合でも、ファイルシステムにループが生じると、 ほかの様々なユーティリティ・プログラムで問題が起きるので、慎重に行わなければならない)。 なお、ハードリンクは、ファイルシステムの境界を越えることができない。 (もっとも、ハードリンクに対するこうした制限は、POSIX で規定されているわけではない。)

それに対して、シンボリックリンク (symbolic link、略称はシムリンク symlink) は、特殊なファイル型の一つである (すべてのカーネルがサポートしているわけではない。たとえば、System V release 3 やそれ以前のシステムにはシムリンクが存在しない)。 このファイル型では、リンクファイルは、実際には別のファイルを、名前を使って参照している。 ほとんどのファイル操作では (ファイルのオープン、読み込み、書き出しなど)、 シンボリックリンク・ファイルが渡されると、カーネルが自動的にリンクの参照を読み解いて (dereference)、リンクの参照先を操作の対象にする。ただし、操作によっては (たとえば、ファイルの削除)、参照先ではなく、リンクファイルそのものを対象にするものもある。 シムリンクの所有者やグループは、リンクを通して行われるファイルアクセスに対して意味を持たないが、 削除制限ビットが立っているディレクトリからシンボリックリンクを削除する際には、かかわりを持ってくる。 GNU のシステムでは、シムリンクのモードには意味がなく、変更することもできない。 だが、BSD システムの中には、モードが変更でき、ファイル名の解決においてシムリンクをたどるかどうかに影響するものもある。 See (libc)Symbolic Links section ‘Symbolic Links’ in The GNU C Library Reference Manual.

シンボリックリンクの中身には、どんな文字列が含まれていてもよい。 シンボリックリンクに含まれる文字列が、実在するファイルの名前になっていないときは、 リンク切れ (dangling symlink) が生ずる。 リンク切れのシンボリックリンクを作成することは、禁止されているわけではない。 シムリンクの作成に絶対パスを使うか、相対パスを使うかには、それぞれ一長一短がある。 絶対パスのシムリンクは、リンクファイルの存在するディレクトリが移動しても、常に同じファイルを指す。 もっとも、そのシムリンクが複数のマシンから見えるような場合には (たとえば、ネットワークでつながったファイルシステムにあるような場合には)、 リンクが指しているファイルは、必ずしも同じではないかもしれない。 相対パスのシンボリックリンクの方は、それが存在しているディレクトリからの相対パスで参照先が決まる。 そこで、リンクファイルがネットワークでつながっているマシンからアクセスされることがある場合に、 リンクと同じデバイス上に存在するファイルを、そのデバイスのマウントポイントが何という名前かを気にせずに指示することができて、 便利であることが多い。

相対パスのシムリンクをカレントディレクトリ以外の場所に作成すると、 そのシムリンクが実際に指しているファイルは、 同じ文字列がカレントディレクトリを基点として指しているファイルとは別のものになる。 そのため、ユーザの多くが、まずカレントディレクトリを変更して、 相対パスのシムリンクを作成する場所へ移動することを好んでいる。 そうすれば、タブ補完などのファイル名参照方法を用いて、 シムリンクに格納する参照先の適切な相対パスを見つけることができるからである。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-b
--backup[=method]

See section バックアップ・オプション. そのままでは、上書きされるか、消去されてしまう各ファイルのバックアップを作成する。

-d
-F
--directory

ユーザが適切な権限を持っていれば、 ディレクトリに対するハードリンクを作成しようとしても許可する。 とは言え、たぶんシステムによって禁止されているので、 たとえスパーユーザでも作成に失敗するだろう。

-f
--force

リンクの作成先に、作成するリンクファイルと同名のファイルがすでに存在していたら、それを削除する。

-i
--interactive

リンクの作成先に、作成するリンクファイルと同名のファイルがすでに存在していたら、 削除するかどうか、ユーザに問い合わせる。

-L
--logical

-s’ オプションが有効になっていないとき、リンク対象として指定されたファイル (訳注: 上記書式の target) がシンボリックリンクならば、 シンボリックリンクそのものではなく、シンボリックリンクが参照しているファイルへのハードリンクを作成する。

-n
--no-dereference

最後のオペランドがディレクトリに対するシンボリックリンクであるとき、それをディレクトリとして特別扱いしない (訳注: すなわち、ディレクトリ内に target と同名でリンクを作ることはしない)。 むしろ、普通のファイルであるかのように扱う。

リンクの作成先として指定されたのが (ディレクトリに対するシムリンクではなく) 本物のディレクトリならば、曖昧なところは全くない。 そのディレクトリ内にリンクを作るだけの話だ。ところが、指定された作成先が、 ディレクトリに対するシムリンクの場合は、ユーザの要求を処理するのに、二つの行き方がある。 ln は、通常のディレクトリを扱う場合と全く同じように作成先を扱って、 そこにリンクを作成することができる。 あるいは、作成先をディレクトリではないもの、すなわち、他ならぬシムリンクと見なすことも可能だ。 後者の場合、ln は、新しいリンクを作成する前に、 そのシムリンクを消去するなり、バックアップするなりしなければならない。 ln のデフォルトは、作成先がディレクトリに対するシムリンクであっても、 ディレクトリと全く同様に扱うことである。

このオプションは、‘--no-target-directory’ (‘-T’) の弱いバージョンである。従って、両方のオプションを指定した場合、こちらは効果がない。

-P
--physical

-s’ オプションが有効になっていないとき、リンク対象として指定されたファイル (訳注: 上記書式の target) がシンボリックリンクならば、 シンボリックリンクそのものへのハードリンクを作成する。 そういった動作をカーネルがサポートしていないプラットホームでは、このオプションを指定すると、 リンク対象のシンボリックリンクと全く同じ内容を持つシンボリックリンクが作成される。 このとき、シンボリックリンクの内容に手が加えられることは決してないので、 どちらのシンボリックリンクを使って行われるファイル名の解決も、 シンボリックリンクへのハードリンクが作成された場合と結局同じになる。

-r
--relative

リンクファイルを置く場所を基点とする相対パスのシンボリックリンクを作成する。

用例:

 
ln -srv /a/file /tmp
'/tmp/file' -> '../a/file'

相対パスのシンボリックリンクは、 それを置くディレクトリと参照先のファイル名を正規化した上で、それに基づいて作成される。 すなわち、そうしたファイル名中にあるすべてのシンボリックリンクは、実体に還元されることになるわけだ。 なお、realpath コマンドを使用すれば、 以下の例に示すように、相対パスを生成する際にもっと融通が利く (訳注: たとえば、realpath を使うと、 ファイル名中のシンボリックリンクをシンボリックリンクのままにしておくこともできる)。 See section realpath: ファイル名を展開して表示する.

 
ln--relative() {
  test "$1" = --no-symlinks && { nosym=$1; shift; }
  target="$1";
  test -d "$2" && link="$2/." || link="$2"
  rtarget="$(realpath $nosym -m "$target" \
              --relative-to "$(dirname "$link")")"
  ln -s -v "$rtarget" "$link"
}
-s
--symbolic

ハードリンクではなく、シンボリックリンクを作る。 このオプションは、シンボリックリンクをサポートしていないシステムでは、 エラー・メッセージを表示するだけである。

-S suffix
--suffix=suffix

-b’ によって作られる各バックアップファイルの後ろに suffix を付ける。 See section バックアップ・オプション.

-t directory
--target-directory=directory

directory を出力先ディレクトリに指定する。 See section 出力先ディレクトリ.

-T
--no-target-directory

最後のオペランドがディレクトリやディレクトリへのシンボリックリンク でも、それを特別扱いしない。 See section 出力先ディレクトリ.

-v
--verbose

リンクの作成に成功した後で、各ファイルの名前を表示する。

-L’ と ‘-P’ の両方を指定すると、最後に指定したものが効果を持つ。 さらに ‘-s’ も指定した場合は、エラーや警告は出ないが、‘-L’ や ‘-P’ は無視される。‘-L’ と ‘-P’ のどちらのオプションも指定しない場合、ln のこの実装では、システムの link 関数がシンボリックリンクに対するハードリンクをサポートしていれば (たとえば、GNU のシステム)、デフォルトの動作は ‘-P’ になる。 link 関数がシンボリックリンクをたどるものならば (たとえば、BSD)、デフォルトの動作は ‘-L’ である。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。

用例:

 
悪い例:

# カレントディレクトリにあるファイル a を指す ../a というリンクを
# 作成する。実のところ役に立たない。../a が自分自身を指すリンクに
# なってしまうからだ。
ln -s a ..

よりよい例:

# 頭がこんがらかってしまわないように、シムリンクを作成する前に、
# リンクを作るディレクトリに移動する。
cd ..
ln -s adir/a .

悪い例:

# 絶対パスによるリンク対象の指定は、リンク対象の位置が変わると、
# 役に立たない。
ln -s $(pwd)/a /some/dir/

よりよい例:

# 相対パスによるリンク対象の指定は、リンクやその対象を含む
# ディレクトリが移動しても、両者の相対的な位置関係が変わらない
# かぎり、問題がない。また、ネットワークでつながったファイル
# システム間でも通用する。
ln -s afile anotherfile
ln -s ../adir/afile yetanotherfile

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on August 15, 2017 using texi2html 1.82.