Linux / コマンド / ln - ハードリンクとシンボリックリンクの作成

lnはファイル間にハードリンクまたはシンボリックリンクを作成するコマンドです。基本動作はハードリンクの作成で、-sを使用すると、対象パス文字列を保存するシンボリックリンクを作成します。

この記事では、二つのリンクの構造的な違い、基本構文、相対・絶対シンボリックリンクの選択、既存リンクの置き換え、リンク状態の確認方法について説明します。

lnコマンドとは?

ハードリンクは同じファイルシステムの同一inode(ファイルを識別する管理情報)を指す別の名前です。シンボリックリンクは異なるパスを指す別のファイルであり、ファイルシステムの境界を越えたりディレクトリを指すことができます。元の名前を削除してもハードリンクが残っていればデータは保持されますが、シンボリックリンクの対象パスが消えると壊れたリンクになります。

基本的な文法

ln [オプション] 対象 リンク名
ln [オプション] 対象 ... ディレクトリ

ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、ln --helpとman lnで現在のシステムの説明を確認してください。

lnの基本的な使い方

ハードリンクを作成する

オプションなしで対象と新しい名前を指定します。二つのパスは同じinodeを指し、片方の内容を変更すると他方の名前でも同じ内容が見えます。

ln original.txt hard-link.txt
stat -c '%i %h %n' original.txt hard-link.txt

シンボリックリンクを作成する

-sを使用します。リンクに保存される対象文字列は、実際の存在に関係なく作成できます。

ln -s /opt/myapp/current app-current
readlink app-current

複数のリンクをディレクトリに作成する

実在する file1 と file2 を現在のディレクトリに用意し、空の links/ を先に作成します。以下の2行は別の指定方法なので、どちらか一方だけを実行してください。-r でリンクの配置場所からの相対パスを計算します。ここで -s だけにすると、links/file1 の対象が file1 となり、自分自身を指すリンクになるため不適切です。

ln -sr file1 file2 links/
ln -sr -t links file1 file2

シンボリックリンクが指すパスを確認する

ln -sは通常、成功メッセージを出力しません。リンク内に記録された対象文字列はreadlinkコマンドで確認します。以下では original.txt と shortcut.txt がまだない別の練習用ディレクトリを使ってください。

printf 'demo\n' > original.txt
ln -s original.txt shortcut.txt
readlink shortcut.txt

例の出力はoriginal.txtです。相対パスはリンクが置かれたディレクトリを基準に解釈されるため、リンクを別の場所に移すと対象が途切れる可能性があります。

主なオプション

オプション 説明
-s, --symbolic ハードリンクの代わりにシンボリックリンクを作成します。
-r, --relative リンクの場所を基準に相対的なシンボリックリンクを作成します。-sと一緒に使用します。
-f, --force 既存の対象 リンク名を削除して新しいリンクを作成します。
-i 既存のリンク名を置き換える前に確認します。
-n 対象がディレクトリを指すシンボリックリンクの場合は、リンク自体として処理します。
-T リンク名をディレクトリではなく正確なパスとして扱います。
-b 置き換える既存ファイルのバックアップを作成します。
-v 作成したリンクを出力します。

長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。

実践的活用例

相対シンボリックリンクを作る

同じディレクトリツリーを別の場所に移動できるようにする場合、相対リンクが役立ちます。相対パスは現在のシェル位置ではなく、リンクファイルが置かれるディレクトリを基準として解釈されます。以下の2行は別々の例です。親ディレクトリと対象を自分の環境に合わせ、未使用のリンク名で試してください。-r は対象と配置先の正規化されたパスを基に相対パスを生成するため、途中にあるシンボリックリンクの名前をそのまま残すとは限りません。

ln -s ../releases/2026-09 app/current
ln -sr /srv/app/releases/2026-09 /srv/app/current

既存リンクを安全に置き換える

配布ポインタのようにリンクを変更する場合は、まず既存のパスが実際のディレクトリなのかシンボリックリンクなのかを確認してください。-sfnT の組み合わせは GNU 環境で正確なリンクパスを置き換える際に使用できますが、対象の検証が先です。以下を replace-link.sh に保存し、自分が所有する練習用ディレクトリで bash replace-link.sh と実行します。最初の readlink が失敗したら停止するため、通常ファイルを誤って置き換えるのを避けられます。ただし検査後に別のプロセスがパスを変更する競合まで防ぐものではなく、他者が書き込める場所での安全な更新手順を保証しません。

readlink current || exit 1
ln -sfnT releases/2026-10 current || exit 1
readlink current

リンクの種類と対象を確認する

ls -l、readlink、stat を一緒に使用すると、リンク文字列と最終対象、inode 関係を確認できます。

ls -l app-current
readlink app-current
readlink -f app-current
stat app-current

ln と関連コマンドの比較

コマンド・方法 主な役割 適した状況
ハードリンク 同じ inode の別の名前 同じファイルシステムの一般ファイル
シンボリックリンク 対象パス文字列を保存する別ファイル ディレクトリ・別のファイルシステム・配布ポイント
cp 別々に編集できるコピー 元のものと別に変更する必要があるとき
バインドマウント パスを別の場所にマウント ファイルシステムレベルのディレクトリの公開が必要なとき

使用する際の注意点

引数の順序を覚えておく

基本の形式は ln 対象 リンク名 です。自然言語のコピー方向と混同すると意図しないリンクが発生する可能性があります。

相対リンクの基準はリンクの位置です

現在のディレクトリで見える相対パスをそのまま入れても、リンクが別のディレクトリに作成されると壊れることがあります。ln -sr または計算された相対パスを使用してください。

ハードリンクはファイルシステムの境界を越えられません

ハードリンクは同じファイルシステムのinodeを共有するため、別のマウントポイントには作成できません。ディレクトリのハードリンクも通常は制限されます。

FAQ

lnのデフォルトはシンボリックリンクですか?

いいえ。デフォルトはハードリンクで、シンボリックリンクを作成するには-sが必要です。

元のファイルを削除するとハードリンクも消えますか?

いいえ。同じinodeを指す他のハードリンクが残っていればデータは保持されます。

シンボリックリンクが壊れているかどうかはどう確認しますか?

readlink リンク で保存されたパスを調べ、readlink -e リンク または test -e リンク でリンク先に到達できるかを確認します。権限不足やリンクの循環も失敗の原因になるため、存在しないことだけが理由とは限りません。

絶対リンクと相対リンクのどちらが良いですか?

リンクを含むツリー全体を移動する必要がある場合は相対リンクが適しており、リンクの位置が変わっても固定されたシステムパスを指す必要がある場合は絶対リンクが適している場合があります。

参考資料