【 ln 】 ファイル間のリンクを作成する 【 Linuxコマンドまとめ 】

Linuxコマンドまとめ

「Linuxコマンドまとめ」カテゴリでは、Linuxのコマンドについて、基本的な実行例とオプションを分かりやすくまとめます。

「ln」はLinuxにおいてファイルやディレクトリのリンクを作成するためのコマンドです。このコマンドを使用することで、複数のファイル名で同じファイルを参照できます。

Linuxシステムではファイル間のリンクがさまざまな形で用いられています。Linuxを使いこなす上で、lnコマンドの使い方とハードリンク・シンボリックリンクの理解は欠かすことができません。しっかりと身に着けておきましょう。

lnコマンドの基本的な使い方

lnコマンドの基本的な書式は次の通りです。

ln [オプション] ターゲット [リンク名]

ハードリンクの作成

ハードリンク(Hard Link)は、ファイルに対して名前(ファイル名)をつける仕組みです。通常、ファイルを作成する際に一つのファイル名、つまりハードリンクを作成しますが、別のファイル名を追加することもできます。ハードリンクを作成するには、以下のようにlnコマンドを使用します。

ln target.txt link.txt

このコマンドを実行すると、元々存在するtarget.txt名前のファイルに、新しいファイル名link.txtが追加されます。同じデータを参照しているので、一方の名前で開いて編集・保存した後、他方で開くと編集されたデータが読み込まれます。

なお、ディレクトリに対してはハードリンクを作成することはできません。また、同じファイルシステム上にあるファイルに対してのみ、ハードリンクを作成できます。上の例では同じディレクトリにハードリンクを作成しましたが、同じファイルシステム上なら別のディレクトリに作成することもできます。

ハードリンクは「通常のファイル名」を追加する仕組みのなので、「元のファイル名」と「後で追加したファイル名」に優劣はありません。なので、上記のコマンドを実行した後、target.txtを削除しても、link.txtを削除しない限りファイルは削除されません。すべてのハードリンクが削除されるまで、ファイルデータは削除されないからです。

ハードリンクの詳細・活用例については後述します。

シンボリックリンクの作成

シンボリックリンク(Symbolic Link)を作成するには、以下のように「-s」オプションを使用します。

ln -s target.txt link.txt

このコマンドを実行すると、target.txtへのシンボリックリンクファイルとしてlink.txtが作成されます。シンボリックリンクはハードリンクと異なり、特殊なファイルとして作成され、リンク先の絶対パスもしくは相対パスをデータとして保持します。上記の例では、「同じディレクトリにあるtarget.txtという名前のファイル」をリンク先として保持することになります。アプリでlink.txtを開くと、target.txtを開いた時と同じように読み書きできます。以下のように、ls -lコマンドでシンボリックリンクの存在とリンク先を確認できます。

$ ls -l
合計 4
lrwxrwxrwx 1 lintaro lintaro   10  6 25 04:22 link.txt -> target.txt
-rw-rw-r-- 1 lintaro lintaro 2102  6 25 04:22 target.txt

シンボリックリンクはリンク先のパスを保持する仕組みなので、元のファイルが移動・削除されると利用できなくなります。しかし、ハードリンクと異なり、シンボリックリンクはディレクトリに対しても作成できるというメリットがあります。また、システム上からアクセス可能なら、同じファイルシステムでなくてもリンクを張ることができます。

シンボリックリンクの詳細・活用例については後述します。

lnコマンドの主なオプション

-s
シンボリックリンクを作成します。
-v
リンク作成時に、作成したリンクと、そのリンク先を出力します。
-f
既存のリンクを無条件に上書きします。

ハードリンクについての追加知識

前述の通り、Linuxにおけるハードリンクは、ファイルシステム内の同じファイルに対してファイル名をリンクさせる仕組みです。複数のハードリンクを作成すると、別のファイル名が同じデータブロックを共有します。

以下に、Linuxのハードリンクに関するいくつかの重要なポイントを説明します。

  1. ファイルシステム内の同じiノードを共有: ハードリンクを追加すると、複数のファイル名がファイルシステム上の同じiノード(ファイルのメタデータを含むデータ構造)を共有します。したがって、ハードリンクを作成すると、元のファイル名と追加したファイル名でディスク上のデータブロックが共有されます。同じファイルに3つ以上のハードリンクを作成することもできます。
  2. ハードリンクの削除: ファイルを削除する場合、そのファイルに対するハードリンクの数が1つずつ減少します。あるファイル名を指定して一つのハードリンクを削除しても、他のハードリンクが残っている場合、ファイルのデータはまだディスク上に存在し続けます。したがって、他のハードリンクからアクセスできますし、ストレージの消費容量も減少しません。
  3. ファイル名の変更: 複数のハードリンクを持つファイルの場合、それらのうち1つのファイル名を変更しても、別のファイル名からは変わらずファイルにアクセスできます。
  4. ハードリンクとシンボリックリンクの違い: ハードリンクは同じファイルシステム上でのみ機能し、ファイルそのものを参照します。一方、シンボリックリンクはファイルへのパスを保持し、異なるファイルシステムやデバイスをまたいでリンクを作成することができます。

シンボリックリンクに比べ、ユーザー自身がlnコマンドでハードリンクを作成するケースは多くありません。しかし、一般的なLinuxシステムをインストールすると、複数のハードリンクを持つファイルがシステム上に作られます。なので、ハードリンクという機能を理解しておくことは、Linuxの運用・トラブルシューティングを行う上で重要です。

たとえばUbuntuでは、/usr/bin/bzip2・/usr/bin/bzcat・/usr/bin/bunzip2はすべて同じファイルのハードリンクとなっています。以下の通り、「ls -il」コマンドで確認することができます。

$ ls -li /usr/bin/bzip2 /usr/bin/bzcat /usr/bin/bunzip2 
2889772 -rwxr-xr-x 3 root root 39296  3 23  2022 /usr/bin/bunzip2
2889772 -rwxr-xr-x 3 root root 39296  3 23  2022 /usr/bin/bzcat
2889772 -rwxr-xr-x 3 root root 39296  3 23  2022 /usr/bin/bzip2

1つ目のフィールド「2889772」はiノード番号です。数値はシステムにより異なります。すべて同じなので、この3つのファイル名は同じファイルを指していることがわかります。そして、3つ目のフィールド「3」はハードリンク数です。3つのファイル名と紐づいている、というわけです。

以下のようにstatコマンドでも、3つのファイル名がすべて同じファイルを指していることが分かります。

$ stat /usr/bin/bzip2 /usr/bin/bzcat /usr/bin/bunzip2 
  File: /usr/bin/bzip2
  Size: 39296           Blocks: 80         IO Block: 4096   通常ファイル
Device: 802h/2050d      Inode: 2889772     Links: 3
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-13 06:33:07.762695363 +0900
Modify: 2022-03-23 18:45:10.000000000 +0900
Change: 2022-05-16 13:25:34.644647872 +0900
 Birth: 2022-05-16 13:25:34.640648593 +0900

  File: /usr/bin/bzcat
  Size: 39296           Blocks: 80         IO Block: 4096   通常ファイル
Device: 802h/2050d      Inode: 2889772     Links: 3
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-13 06:33:07.762695363 +0900
Modify: 2022-03-23 18:45:10.000000000 +0900
Change: 2022-05-16 13:25:34.644647872 +0900
 Birth: 2022-05-16 13:25:34.640648593 +0900

  File: /usr/bin/bunzip2
  Size: 39296           Blocks: 80         IO Block: 4096   通常ファイル
Device: 802h/2050d      Inode: 2889772     Links: 3
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-13 06:33:07.762695363 +0900
Modify: 2022-03-23 18:45:10.000000000 +0900
Change: 2022-05-16 13:25:34.644647872 +0900
 Birth: 2022-05-16 13:25:34.640648593 +0900

Bzip2はデータ圧縮・展開を行うプログラムですが、一つの実行バイナリが、bzip2で実行された時はデフォルトで圧縮を、bunzip2で実行された時は展開を、bzcatで実行された時は標準出力に展開を行うように作られているため、このように1つのファイルが複数のハードリンクを持つよう配置されているわけです。

シンボリックリンクについての追加知識

シンボリックリンクは、Linuxシステムにおいてファイルやディレクトリへの参照を作成するための特殊なファイルです。シンボリックリンクは、実際のファイルやディレクトリに対する参照であり、別のディレクトリや名前でファイルにアクセスすることを可能にします。

以下に、シンボリックリンクファイルに関するいくつかの重要なポイントを説明します。

  1. ファイルシステムをまたいだリンク: シンボリックリンクは、異なるファイルシステムやデバイスをまたいでリンクを作成することができます。これは、ハードリンクとは異なる点です。
  2. リンク先の変更: シンボリックリンクは、リンク先のファイルやディレクトリが存在しない場合でも有効なままであり、リンク先が移動しても自動的には変更されません。そのため、リンク先のファイルやディレクトリが移動あるいは削除されてしまうと、シンボリックリンクは「リンク切れ」となり、アクセスできなくなります。
  3. シンボリックリンクの利用例: シンボリックリンクは、以下のようなさまざまな用途で活用されます。
    • ファイルやディレクトリのエイリアスを作成する場合、略名でアクセスするための便利な手段として使用されます。
    • インストールされたプログラムやライブラリへのパスを設定する場合、シンボリックリンクを使用してシンボリックな参照を作成することがあります。
    • ネットワーク上のファイルシステムにアクセスする場合、シンボリックリンクを使用してローカルのファイルパスをネットワークパスに関連付けることができます。

このように、シンボリックリンクは、柔軟なリンク作成の手段として広く使用されており、ファイルやディレクトリの操作やシステムの設定において重要な役割を果たしています。

多くのLinuxディストリビューションでは、システムの各所にシンボリックリンクファイルを見つけることができます。たとえば、libfoo.so.1.0というバージョン1.0のライブラリが存在する場合、libfoo.soというシンボリックリンクが作成され、libfoo.so.1.0を指すといった配置が行われています。これにより、プログラムはlibfoo.soを通じてシステム上にインストールされたバージョンのライブラリにアクセスできます。

また、/etc/alternativesには多くのシンボリックリンクが張られており、システムにインストールされているコマンドなどにリンクされています。このリンクは、update-alternativesコマンドでカスタマイズ可能です。これにより、たとえば「vi」コマンドを実行したときに、実行するviエディタのフレーバーを好みのものに切り替える、といった機能が実現されています。

lnのヘルプ

Usage: ln [OPTION]... [-T] TARGET LINK_NAME
  or:  ln [OPTION]... TARGET
  or:  ln [OPTION]... TARGET... DIRECTORY
  or:  ln [OPTION]... -t DIRECTORY TARGET...
In the 1st form, create a link to TARGET with the name LINK_NAME.
In the 2nd form, create a link to TARGET in the current directory.
In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
Create hard links by default, symbolic links with --symbolic.
By default, each destination (name of new link) should not already exist.
When creating hard links, each TARGET must exist.  Symbolic links
can hold arbitrary text; if later resolved, a relative link is
interpreted in relation to its parent directory.

Mandatory arguments to long options are mandatory for short options too.
      --backup[=CONTROL]      対象ファイルが存在する時にバックアップを作成する
  -b                          --backup と同様だが引数を取らない
  -d, -F, --directory         スーパーユーザがディレクトリに対するハードリンク
                                を作成することを許可する。(備考: スーパーユーザ
                                であってもシステムの制限で失敗することがある)
  -f, --force                 対象ファイルが存在する時に削除する
  -i, --interactive           prompt whether to remove destinations
  -L, --logical               dereference TARGETs that are symbolic links
  -n, --no-dereference        treat LINK_NAME as a normal file if
                                it is a symbolic link to a directory
  -P, --physical              make hard links directly to symbolic links
  -r, --relative              create symbolic links relative to link location
  -s, --symbolic              make symbolic links instead of hard links
  -S, --suffix=SUFFIX         override the usual backup suffix
  -t, --target-directory=DIRECTORY  specify the DIRECTORY in which to create
                                the links
  -T, --no-target-directory   treat LINK_NAME as a normal file always
  -v, --verbose               print name of each linked file
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable.  Here are the values:

  none, off       バックアップを作成しない (--backup を付けた時でも)
  numbered, t     番号付きバックアップを作成する
  existing, nil   番号付きバックアップがあれば番号付き、
                      そうでなければ、simple で作成する
  simple, never   常に簡易バックアップを作成

Using -s ignores -L and -P.  Otherwise, the last option specified controls
behavior when a TARGET is a symbolic link, defaulting to -P.

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/ln>
or available locally via: info '(coreutils) ln invocation'

lnのマニュアル

LN(1)                          ユーザーコマンド                          LN(1)

名前
       ln - ファイル間のリンクを作成する

書式
       ln [OPTION]... [-T] TARGET LINK_NAME   (1番目の形式)
       ln [OPTION]... TARGET                  (2番目の形式)
       ln [OPTION]... TARGET... DIRECTORY     (3番目の形式)
       ln [OPTION]... -t DIRECTORY TARGET...  (4番目の形式)

説明
       1 番目の書式では TARGET に対する LINK_NAME という名前のリンクを作成しま
       す。 2 番目の書式では TARGET に対するリンクを現在のディレクトリに作成し
       ます。  3 番目と 4 番目の書式では、各 TARGET に対するリンクを DIRECTORY
       に作成します。 デフォルトではハードリンクが作成されます。 --symbolic を
       使用すると、シンボリックリンクが作成されます。   デフォルトでは、作成先
       (新しいリンクの名前) がすでに存在していてはいけません。  ハードリンクを
       作成する場合は TARGET が存在しなければいけません。 シンボリックリンクは
       任意のテキストを保持することができます。 後でシンボリックリンクを辿る際
       には、相対的なリンクは親ディレクトリに対する ものとして解釈されます。

       長いオプションで必須となっている引数は短いオプションでも必須です。

       --backup[=CONTROL]
              対象ファイルが存在する時にバックアップを作成する

       -b                          --backup と同様だが引数を取らない

       -d, -F, --directory
              スーパーユーザがディレクトリに対するハードリンク  を作成すること
              を許可する。(備考: スーパーユーザ であってもシステムの制限で失敗
              することがある)

       -f, --force
              対象ファイルが存在する時に削除する

       -i, --interactive
              対象を削除するかどうか確認メッセージを表示する

       -L, --logical
              TARGET がシンボリックリンクの場合リンクを辿る

       -n, --no-dereference
              対象がディレクトリに対するシンボリックリンクの場合  通常ファイル
              に対するリンクとして扱う

       -P, --physical
              シンボリックリンク自体へのハードリンクを作成する

       -r, --relative
              リンクの場所からの相対パスのシンボリックリンクを作成する

       -s, --symbolic
              ハードリンクではなくシンボリックリンクを作成する

       -S, --suffix=SUFFIX
              バックアップ接尾辞を SUFFIX にする

       -t, --target-directory=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 で作成する

       simple, never
              常に簡易バックアップを作成

       -s  を使用した時は  -L および -P は無視されます。それ以外の場合、TAREGT
       が シンボリックリンクの場合は最後に指定したオプションが効果を持ちます。
       デフォルトは -P です。

       GNU                    coreutils                    のオンラインヘルプ:
       <http://www.gnu.org/software/coreutils/>    ln     の翻訳に関するバグは
       <http://translationproject.org/team/ja.html>  に連絡してください。 完全
       な文書は <http://www.gnu.org/software/coreutils/ln> にあります。 ローカ
       ルでは info '(coreutils) ln invocation' で参照できます。

作者
       作者 Mike Parker および David MacKenzie。

著作権
       Copyright © 2016 Free Software Foundation, Inc.  ライセンス GPLv3+: GNU
       GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
       This is free software: you are free  to  change  and  redistribute  it.
       There is NO WARRANTY, to the extent permitted by law.

関連項目
       link(2), symlink(2)

       ln  の完全なマニュアルは Texinfo マニュアルとして整備されている。もし、
       info および ln のプログラムが正しくインストールされているならば、コマン
       ド

              info ln

       を使用すると完全なマニュアルを読むことができるはずだ。

GNU coreutils                      2016年2月                             LN(1)
Linuxコマンドまとめ
\シェアお願いします/
LFI

コメント

タイトルとURLをコピーしました