【Linux】lnコマンドの使い方|シンボリックリンク作成(-s)・強制上書き(-nfs)・安全な削除方法まとめ

コマンドリファレンス

Linux環境で開発やサーバー運用を行う際、頻繁に利用するのが ln コマンドによる シンボリックリンク(Symbolic Link) の作成です。しかし実務の現場では、「リンク元とリンク先、どっちを先に書くんだっけ?」「既存のリンクを別の向き先に安全に切り替えたい」「ディレクトリへのリンクを rm で消そうとしたら中身まで吹き飛んだ……」といったトラブルや迷いが後を絶ちません。

「手作業でのパス変更は負け、リンクの張り替えこそ自動化運用の基本」 です。Webアプリケーションのゼロダウンタイムデプロイ( current ディレクトリの切り替え)やログ保存先のSSD移行など、シンボリックリンクを正しく安全に扱えるスキルはインフラ運用の必須科目と言えます。

本記事では、日常のターミナル作業からシェルスクリプト自動化まで迷わず使えるよう、 「リンク元・リンク先の絶対に忘れない覚え方」 「シンボリックリンクとハードリンクの違い」 「強制上書きで ln -nfs が鉄則となる理由」 「ディレクトリリンク安全削除の落とし穴」 を実務目線で徹底解説します。

【結論】これだけ覚えれば迷わない基本形と上書き形早見表

まずは現場で「今すぐコピペして使いたい」という方のために、実務の9割をカバーする4大必須構文をまとめました。

目的・やりたいこと実行コマンド解説・実務のポイント
シンボリックリンク作成 ln -s <実体パス> <リンク名>基本形。 cp と同じ「元 → 先」の順番で指定する。
既存リンクの強制張り替え ln -nfs <新実体> <リンク名>ディレクトリリンクの上書きは -n が必須。デプロイの鉄則。
リンク先(実体)の確認 readlink -f <リンク名>ls -l より確実。多重リンクも解決して絶対パスを表示。
安全なリンクの個別解除 unlink <リンク名>末尾に / を付けない専用コマンド。誤爆削除を防ぐ。
# 1. 最短でのシンボリックリンク作成(実体 -> リンク名)
ln -s /var/www/releases/v2.1.0 /var/www/current

# 2. 既存リンクの強制張り替え(ディレクトリでも中に入らず上書き)
ln -nfs /var/www/releases/v2.2.0 /var/www/current

# 3. リンク先の実体パスを確認
readlink -f /var/www/current
# 出力例: /var/www/releases/v2.2.0

# 4. リンクのみを安全に解除(末尾スラッシュ事故を防ぐ)
unlink /var/www/current

lnコマンドの基本構文と「リンク元・リンク先」の覚え方

ln は英語の「link(リンク)」に由来するコマンドで、ファイルやディレクトリに対して別の名前(参照)を付与するために使います。構文自体はシンプルですが、引数の順番で混乱するエンジニアが非常に多いコマンドでもあります。

基本書式: ln -s [実体(リンク元)] [作成するリンク名(リンク先)]

シンボリックリンクを作成する際の基本構文は以下の通りです。

ln -s <実体(リンク元ターゲット)> <作成するリンク名(リンク先)>

順番に迷ったときは、 「 cpコマンド( cp コピー元 コピー先 )と全く同じ語順」 と覚えるのが最も確実です。

「すでに存在しているデータの実体(元)から、これから新しく作り出すショートカット名(先)へ向けて矢印が伸びる」とイメージしてください。第2引数の「リンク名」を省略した場合は、カレントディレクトリ内に「実体と同じ名前」のリンクが作成されますが、意図せぬ動作を防ぐためにも 実務では常にリンク名を明記する のが安全です。

# 実例: /etc/nginx/sites-available/app.conf のリンクを sites-enabled/ 配下に作成
ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/app.conf

絶対パス指定と相対パス指定の違いと使い分け

シンボリックリンクを作成する際、リンク元のパス指定には 「絶対パス」「相対パス」 の2種類があります。ここには初心者が必ず一度は引っかかる 巨大な罠 が潜んでいます。

「相対パスで指定した場合、その相対位置は『コマンドを実行したカレントディレクトリから』ではなく、『作成されたシンボリックリンクが置かれている場所から』解釈される」 という点です。

# 【失敗例】カレントディレクトリが /home/user の状態で実行
ln -s data/config.json /var/www/app/config.json
# → /var/www/app/config.json は「/var/www/app/data/config.json」を探しに行き、リンク切れ(Dangling)になる!

# 【成功例1:絶対パスで指定】(最も安全・推奨)
ln -s /home/user/data/config.json /var/www/app/config.json

# 【成功例2:リンク配置先からの相対パスを計算して指定】
ln -s ../../../home/user/data/config.json /var/www/app/config.json
指定方式メリットデメリット推奨される実務シーン
絶対パス指定 どこから参照してもリンク切れが起きない。確実で安全。ディレクトリ全体を別のサーバーや階層へ移動するとリンクが壊れる。システム設定( /etc 配下)、Webサーバー公開設定、バックアップ配置。
相対パス指定 ディレクトリ階層ごと丸ごとアーカイブ・移動してもリンク関係が維持される。相対パスの階層計算( ../ )を誤りやすく、ミスが起きやすい。Gitリポジトリ管理下のプロジェクト内部、ポータブルな配布パッケージ。

サーバー構築やインフラ運用の現場では、パス解釈のミスを防ぐために 「原則として絶対パスで記述する」 ことを強くおすすめします。

シンボリックリンクとハードリンクの違い(比較表)

ln コマンドで -s オプションを付けずに実行すると、 ハードリンク(Hard Link) が作成されます。両者の根本的な違いは、Linuxファイルシステムの inode(ファイル管理構造) にあります。

ハードリンクは「同一のinode番号(ディスク上のデータ実体)を指す別名」を作成します。そのため、元のファイル名を削除しても、ハードリンクが存在する限りデータの実体は消えません。一方、シンボリックリンクは「リンク先へのパス文字列が格納された独立した小さな特殊ファイル」です。

比較項目シンボリックリンク( ln -sハードリンク( ln
仕組み リンク先の「パス情報」を持つ特殊ファイル実体データ(inode)への直接的な別名
inode番号 元ファイルとは 異なる番号 が割り当てられる元ファイルと 全く同じ番号 を共有する
元ファイル削除時 リンク切れ(Broken link)となり参照不可リンク側から そのままデータを読み書き可能
ディレクトリへのリンク 可能 (実務で多用される) 原則不可 (無限ループ防止のためrootでも禁止)
別ファイルシステム跨ぎ 可能 (別パーティション・NFS等もOK) 不可 (同一ファイルシステム内限定)
ファイルサイズ リンク先パス文字列のバイト数(数バイト〜数十バイト)元ファイルと同一のサイズとして表示される
パーミッション変更 リンク自体の権限は常に lrwxrwxrwx (実体の権限が適用)元ファイルと権限変更が完全に同期する

実務でハードリンクを使うケースは「バックアップツール( rsync --link-dest 等)によるスナップショット作成」など極めて限定的です。日常の開発やシステム運用では、 ほぼ100%シンボリックリンク( ln -s )を使用する と考えて差し支えありません。

実務でよく使うオプションと操作パターン

ln コマンドには、リンク作成の挙動を制御するいくつかの重要なオプションが備わっています。まずは頻出オプションを一覧で確認しましょう。

オプションロング名機能・効果実務での利用シーン
-s--symbolicシンボリックリンクを作成するすべてのシンボリックリンク作成で必須
-f--force同名のリンクやファイルが存在する場合、強制的に削除して作成既存リンクの上書き張り替え
-n--no-dereferenceリンク先がディレクトリのシンボリックリンクである場合、通常のファイルとして扱うディレクトリリンクの上書き時に 必須
-i--interactive上書き対象が存在する場合、確認プロンプトを表示手動オペレーション時の安全確認
-v--verbose作成・更新されたリンクの情報を標準出力に表示デプロイスクリプトやバッチログの記録
-b--backup上書き時に既存ファイルをバックアップ( ~ 付き)として退避設定ファイル安全更新時の自動バックアップ

ディレクトリのシンボリックリンクを作成する

ファイルだけでなく、ディレクトリに対してもシンボリックリンクを作成できます。構文はファイルの場合と全く同一です。

# /mnt/fast_ssd/storage へのリンクを /var/data として作成
ln -s /mnt/fast_ssd/storage /var/data

# 作成されたリンクを経由して中身にアクセス
ls -la /var/data/
cd /var/data

Webアプリケーションの運用では、リリースごとの資材ディレクトリ( releases/v2.1.0/ )を作成し、Webサーバーの公開ルートからは常に current というディレクトリシンボリックリンクを参照させる設計が標準です。この方式を採ることで、リンク先を切り替えるだけで一瞬でバージョンアップやロールバック(切り戻し)が可能になります。

既存リンクを強制上書き・張り替える(ln -nfs の理由)

すでに存在するシンボリックリンクの向き先を、新しいターゲットへ張り替えたい場面は日常茶飯事です。このとき、多くの人が ln -sf を実行して 予期せぬ大惨事 に直面します。

上書き対象が「ディレクトリへのシンボリックリンク」だった場合、 -n を付けずに ln -sf を実行すると、 「リンク自体が上書きされるのではなく、リンク先のディレクトリの『中に』新しいリンクが作成されてしまう」 というLinuxの仕様があるためです。

# 状況: /var/www/current -> /var/www/releases/v1(ディレクトリへのリンク)
# ここで v2 に切り替えようとして -sf だけで実行すると……
ln -sf /var/www/releases/v2 /var/www/current

# 【結果の悲劇】
# /var/www/current 自体は v1 を向いたまま!
# その代わりに /var/www/releases/v1/v2 という謎のリンクが中に作られてしまう!

この誤動作を完全に防ぐのが -n ( –no-dereference )オプション です。 -n を付与すると、リンク先がディレクトリであっても「単なるシンボリックリンクという1つのファイル」として認識され、ディレクトリ内部への侵入を阻止して確実にリンク自体を上書きできます。

# 【実務の鉄則】既存リンクの強制張り替えは必ず -nfs を使う!
ln -nfs /var/www/releases/v2 /var/www/current

# ログ出力付きで実行する場合(CI/CDやデプロイスクリプトに最適)
ln -nfsv /var/www/releases/v2 /var/www/current
# 出力例: '/var/www/current' -> '/var/www/releases/v2'

CI/CDパイプラインやシェルスクリプトでシンボリックリンクを張り替える際は、 「 ln -nfs 以外の選択肢はない」 と心に刻んでおきましょう。

シンボリックリンクのリンク先確認方法(ls -l / readlink)

作成したリンクが意図通りの実体を指しているか確認するには、主に ls -lreadlink コマンドを使用します。

# 1. ls -l でリンク先と属性を確認
ls -l /var/www/current
# 出力例: lrwxrwxrwx 1 www-data www-data 24 Sep 13 10:00 /var/www/current -> /var/www/releases/v2

# 2. readlink でリンク先のパスのみを抽出
readlink /var/www/current
# 出力例: /var/www/releases/v2

# 3. readlink -f で多重リンクや相対パスを解決した「絶対正規化パス」を取得
readlink -f /var/www/current
# 出力例: /var/www/releases/v2

シェルスクリプト内で「現在の向き先ディレクトリ名を変数に取得して判定したい」というケースでは、 ls -lawk でパースするのではなく、 readlink -f “$LINK_PATH” を使うのが最もスマートで堅牢な設計です。

シンボリックリンクの安全な削除・解除方法

不要になったシンボリックリンクを削除する際、 「実体ファイルを誤って削除してしまう」 「ディレクトリの中身を全滅させてしまう」 という現場事故が後を絶ちません。安全な削除手順と、壊れたリンクの検出方法をマスターしましょう。

rmコマンドで削除する際の注意点(末尾のスラッシュ「/」を付けない罠)

通常、シンボリックリンクは通常のファイルと同様に rm コマンドで削除できます。リンクを削除しても、リンク先にある実体ファイルが消えることはありません。

# ファイル・ディレクトリ問わず、安全にリンクのみを削除する
rm /var/www/current

しかし、 ディレクトリへのシンボリックリンクを削除する際、シェルの補完等で末尾にスラッシュ( / )が付いてしまった場合 に致命的なトラブルが発生します。

# 【NG例1】末尾にスラッシュを付けて rm を実行
rm /var/www/current/
# エラー: rm: cannot remove '/var/www/current/': Is a directory
# (スラッシュが付くことで「リンク」ではなく「リンク先の実体ディレクトリ」と解釈されるため)

# 【最悪の大惨事例】エラーが出たからと -r を付けて実行
rm -rf /var/www/current/
# → リンク自体は削除されず、リンク先の実体ディレクトリ内の全ファイルが根こそぎ消滅する!!

ターミナルで rm /var/www/cur[Tab] と補完すると、シェルは自動的に末尾に / を補完してしまいます。この状態で rm -rf を叩くと、 「リンクを消すつもりが、本番リリースディレクトリの中身を全削除した」 というインシデントに直結します。 rm でリンクを消す際は、 「末尾のスラッシュは絶対に削る」 ことを徹底してください。

unlinkコマンドを使った安全な個別削除

前述の「末尾スラッシュ事故」を構造的に100%防ぐための最良の手段が、 unlink コマンド の採用です。

# unlink による安全なシンボリックリンク削除
unlink /var/www/current

unlink はシステムコール unlink() を直接呼び出すシンプルなコマンドで、単一のファイルやリンクを解除する機能しか持ちません。最大の特徴は、 「末尾にスラッシュが付いた引数を渡すとエラーになって一切削除を実行しない」 という安全設計にあります。

# 末尾にスラッシュが付いていると実行を拒否してくれる
unlink /var/www/current/
# 出力例: unlink: cannot unlink '/var/www/current/': Not a directory または No such file

誤ってディレクトリの中身を消滅させるリスクが原理的に存在しないため、スクリプト内でのリンク解除や、ディレクトリリンクの手動削除には rm ではなく unlink を使うのがプロの現場のベストプラクティスです。

リンク先が消えた「壊れたリンク(Dangling link)」の探し方(find -xtype l)

リンク先の実体ファイルが移動・削除されたり名前が変わると、シンボリックリンクはどこも指していない 「壊れたリンク(Dangling symlink / 孤児リンク)」 になります。ターミナル上で ls を実行すると赤色で点滅表示されるあれです。

システム内に放置された壊れたリンクを一括で検出・掃除するには、 findコマンド-xtype l オプションを活用するのが最も手軽で強力です。

# 1. カレントディレクトリ配下の壊れたシンボリックリンクを一覧表示
find . -xtype l

# 詳細情報(リンク名と存在しないリンク先パス)付きで表示
find . -xtype l -exec ls -l {} +

# 2. 検出した壊れたリンクのみを安全に一括削除
find . -xtype l -delete

# 削除前に念のため確認プロンプトを挟みたい場合
find . -xtype l -ok rm {} ;

-type l だけを指定すると「正常なリンクも含めたすべてのシンボリックリンク」がヒットしてしまいますが、 -xtype l を指定することで 「参照先が解決できない(実体が存在しない)リンクのみ」 を正確にフィルタリングできます。サーバーの定期メンテナンスやデプロイ後のクリーンアップスクリプトに組み込んでおくと便利です。

まとめ & 関連記事

Linuxにおける ln コマンドとシンボリックリンク運用の要点を振り返りましょう。

  • 語順は常に「実体(元) → リンク名(先)」 : cp コマンドと同様に「元から先へ」と覚えれば二度と迷いません。パス解釈の事故を防ぐため実務では絶対パス指定が基本です。
  • 既存リンクの上書き・張り替えは ln -nfs が鉄則 : ディレクトリへのリンクを張り替える際、 -n--no-dereference )を付けないとディレクトリ内部にリンクが作られてしまいます。
  • リンク削除は unlink か末尾スラッシュなし rm : rm -rf link/ は実体ディレクトリの中身を全滅させる危険なトラップです。安全性を重視するなら unlink を活用しましょう。

シンボリックリンクの仕組みを正確に理解しておくことは、シェルスクリプトによる自動デプロイやストレージ運用を堅牢に保つための土台となります。本記事の早見表と注意点をぜひ手元の開発・運用に役立ててください。

関連記事(内部リンク)

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント