シンボリックリンクとは?意味とlnコマンドでの作成方法をわかりやすく解説

コマンドリファレンス

シンボリックリンク(symbolic link、ソフトリンクとも呼ばれる)とは、ファイルやディレクトリの場所(パス)を指し示すだけの特殊なファイルです。実体のデータは持たず、リンク先のパス文字列だけを保持するため、Windowsの「ショートカット」やmacOSの「エイリアス」に近い仕組みだとイメージすると分かりやすいです。Linux/Unix系OSでは ln コマンドで作成します。

シンボリックリンクとは

シンボリックリンクは、ファイルシステム上で「このパスを見に行ってください」という参照情報だけを持つ小さな特殊ファイルです。リンク自体には元ファイルの中身は含まれておらず、リンクを開くとOSが自動的にリンク先のファイルへアクセスします。同じ仕組みを持つ機能は、Windowsでは「ショートカット」、macOSでは「エイリアス」と呼ばれています。

シンボリックリンクの見分け方

ls -l で一覧表示すると、パーミッションの先頭が l になり、リンク名の後ろに -> でリンク先のパスが表示されます。

$ ls -l symlink.txt
lrwxrwxrwx 1 user user 12 Jul 20 02:11 symlink.txt -> original.txt

サイズ(この例では12バイト)はリンク先のパス文字列の長さであり、リンク元ファイルの実データサイズとは異なります。file symlink.txt でも「symbolic link to …」と表示され確認できます。

ハードリンクとの違い

項目シンボリックリンクハードリンク
参照方法リンク先のパス文字列を保持元ファイルと同じ inode を共有
ファイルシステムをまたぐ可能不可(同一ファイルシステム内のみ)
ディレクトリへのリンク可能通常不可
リンク元を削除した場合参照先を失い「壊れたリンク」になる他のリンクが残っていれば実体にアクセス可能
サイズパス文字列の分だけ(小さい)元ファイルと同じ

メリットと使いどころ

実体ファイルを物理的に移動・コピーすることなく、複数の場所から同じファイルを参照できるのが最大のメリットです。設定ファイルの切り替えやデプロイ先バージョンの切り替え(後述の「よくある使い方」を参照)など、参照先だけを差し替えたい場面でよく使われます。一方で、リンク元を削除・移動すると参照が壊れる(broken link)点には注意が必要です。

lnコマンドでの作成方法(構文)

# ハードリンク作成
ln [オプション] 既存ファイル リンク名

# シンボリックリンク作成
ln -s [オプション] 既存ファイル リンク名

主なオプション一覧

オプション説明使用例
(なし)ハードリンクを作成ln file.txt link.txt
-sシンボリックリンクを作成ln -s /etc/nginx/nginx.conf conf_link
-f既存のリンクを強制的に上書きln -sf new.conf conf_link
-i上書き時に確認を求めるln -si file.txt link.txt
-nシンボリックリンクを上書きする際にリンクをたどらないln -snf file link
-r-sと併用し、リンク先を自動で相対パスに変換ln -sr /app/config/prod.yml config.yml
-tリンク作成先のディレクトリを指定し、複数ファイルをまとめてリンクln -s -t dest/ a.txt b.txt
-v作成したリンクを表示ln -sv file.txt link.txt
-Tリンク名を必ず通常のファイルとして扱うln -sT file linkname

実行例

ハードリンクを作成

ln original.txt hardlink.txt

出力(確認):

ls -li original.txt hardlink.txt

例:

123456 -rw-r--r-- 2 user user 100 Aug 21 10:00 hardlink.txt
123456 -rw-r--r-- 2 user user 100 Aug 21 10:00 original.txt

(同じ inode 番号を持つ)

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

ln -s /var/log/syslog syslog_link

出力(確認):

ls -l syslog_link
lrwxrwxrwx 1 user user 14 Aug 21 11:00 syslog_link -> /var/log/syslog

リンクを強制的に上書き

ln -sf new.conf conf_link

相対パスのシンボリックリンクを作成

ln -s ../config/settings.conf settings_link

相対パスを自動計算する(-r オプション)

-s-rを組み合わせると、絶対パスで指定した場合でもリンク先を自動的に相対パスへ変換してくれます。手動で「../」の数を数える手間や計算ミスを防げます。

ln -srv /app/config/prod.yml releases/current/prod.yml
'releases/current/prod.yml' -> '../../app/config/prod.yml'

複数ファイルを1つのディレクトリへまとめてリンク(-t オプション)

-tでリンク作成先のディレクトリを指定すると、複数のファイルを1回のコマンドでまとめてリンクできます。ln 対象... ディレクトリの書き方(第3形式)でも同じ結果になります。

ln -s -t dest/ a.txt b.txt c.txt
# 上と同じ結果になる書き方
ln -s a.txt b.txt c.txt dest/

エラー例(存在しないファイルをリンク)

ln notfound.txt link.txt

出力例:

ln: failed to access 'notfound.txt': No such file or directory

よくある使い方

実行中バージョンを切り替える「currentリンク」パターン

デプロイ先ディレクトリを世代ごとに分けて配置し、current というシンボリックリンクだけを新しい世代に張り替えることで、無停止でのバージョン切り替えができます。

/app/releases/20260710/
/app/releases/20260711/
/app/current -> /app/releases/20260711/

# 新しいリリースに切り替え
ln -sfn /app/releases/20260711 /app/current

-n を付けることで、current がディレクトリを指すシンボリックリンクであっても、その中身ではなくリンク自体を張り替えられます(後述の「注意点」も参照)。

環境ごとに設定ファイルを切り替える

ln -sf config.production.yml config.yml

本番用・開発用など複数の設定ファイルを用意しておき、実際に読み込まれるファイル名(config.yml)へのリンク先だけを切り替える運用です。

シンボリックリンクの削除方法と注意点

シンボリックリンク自体を削除するには rm または unlink を使います。rm コマンドでリンクを削除しても、リンク元の実体ファイルは削除されません。

rm syslog_link
# または
unlink syslog_link

注意:リンク先がディレクトリの場合、末尾にスラッシュを付けて rm syslog_link/ のように削除しようとすると、シェルによってはリンクではなく参照先ディレクトリの中身に対して操作してしまうことがあります。ディレクトリを指すリンクを削除するときは、末尾のスラッシュを付けずに rm リンク名 と実行してください。

注意:-tで相対パスのファイルを指定すると、リンクの実体はリンク作成先ディレクトリの中に置かれるため、相対パスの基準がずれて壊れたリンクになることがあります。-tを使うときは対象ファイルを絶対パスで指定するか、-rを併用してください。

FAQ

シンボリックリンクとは一言でいうと何ですか?

ファイルやディレクトリの場所(パス)を指し示すだけの特殊なファイルです。実体のデータは持たず、Windowsの「ショートカット」やmacOSの「エイリアス」に近い仕組みです。Linux/Unix系OSではln -sコマンドで作成します。

ハードリンクとシンボリックリンク、どちらを使うべきですか?

ディレクトリや他のファイルシステムをまたいでリンクしたい場合は、シンボリックリンクを使います。同一ファイルシステム内でリンク先が消えても参照を維持したい場合はハードリンクが有効です。迷った場合は、汎用性が高く挙動が分かりやすいシンボリックリンク(ln -s)を選ぶのが無難です。

シンボリックリンクの参照先(絶対パス)を確認するには?

readlink -f を使うと、相対パスで作成したリンクでも参照先を絶対パスで表示できます。

readlink -f settings_link

「壊れたリンク(broken link)」を一覧表示するには?

参照先が存在しないシンボリックリンクをディレクトリ配下から探すには、以下のように find を使います。

find . -xtype l

関連コマンド

  • cp : ファイルをコピー(リンクではなく独立したファイル)
  • readlink : シンボリックリンクの参照先を表示
  • stat : inode 番号やリンク数を確認
  • namei : パス上の各要素をシンボリックリンクごと辿って表示
  • rm : ファイルやシンボリックリンクを削除

参考

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント