| この記事の要点 |
|
ファイル/ディレクトリへのショートカット作成(シンボリックリンク)
以下のコマンドを実行することでファイル/ディレクトリへのショートカット(シンボリックリンク)を作成することが可能です。
ln -s ファイルパス リンク名
引数の順番は cp と同じで「元(実体)が先、リンク名が後」です。逆にすると、存在しないファイルを指すリンクができてしまいます。
# /var/www/html を ~/html から開けるようにする
ln -s /var/www/html ~/html
# リンク名を省略すると、カレントディレクトリに同じ名前のリンクができる
cd /usr/local/bin
ln -s /opt/myapp/bin/myapp
# 結果を確認(l で始まり、矢印でリンク先が表示される)
ls -l ~/html
# lrwxrwxrwx 1 user user 13 ... /home/user/html -> /var/www/html
シンボリックリンクとハードリンクの違い
「-s」オプションがない場合はハードリンクになります。両者は仕組みがまったく違います。
| 項目 | シンボリックリンク(ln -s) | ハードリンク(ln) |
|---|---|---|
| 仕組み | リンク先の「パス」を記録した小さなファイル | 同じ実体(inode)に付けたもう 1 つの名前 |
| 元ファイルを削除すると | リンクは残るが中身にアクセスできない(リンク切れ) | もう一方の名前から引き続き読める。すべての名前が消えたときに実体が消える |
| ディレクトリ | 作れる | 作れない |
| 別のファイルシステム(別パーティション・別ディスク) | 作れる | 作れない |
| 見分け方 | ls -l で先頭が l、名前の後に -> とリンク先が出る | 普通のファイルと同じ。ls -li で inode 番号が同じ、リンク数が 2 以上 |
| Windows での近いもの | シンボリックリンク(mklink)、用途はショートカットに近い | mklink /H のハードリンク |
ハードリンクでは、元の名前を rm しても削除は普通にできます。消えるのはその名前だけで、別の名前が残っている限りデータは残ります。「どちらが元」という区別もありません。日常的な「ショートカット」用途ならシンボリックリンクを使うのが一般的です。
シンボリックリンクがよく使われる場面
- コマンドを PATH の通った場所に置く:
/optに展開したツールの実行ファイルを/usr/local/binにリンクし、どこからでもコマンド名で実行できるようにする - 設定ファイルの有効化: Nginx(Debian / Ubuntu 系)は
sites-availableに置いた設定をsites-enabledにリンクすることで有効にする - リリースの切り替え: バージョンごとのディレクトリを用意し、
currentというリンクの向き先を変えるだけで切り替え・切り戻しをする - 容量の大きいデータを別ディスクへ逃がす: 実体を別ディスクに移し、元の場所にリンクを置いてアプリからは同じパスで見えるようにする
リンクの削除
unlink リンク名
# または
rm リンク名
どちらもリンクそのものだけを削除し、リンク先のファイルやディレクトリは消えません。
注意: ディレクトリへのシンボリックリンクを消すとき、シェルの補完で付いた末尾の / を残さないでください。rm -rf html/ のように書くと、リンクではなくリンク先ディレクトリの中身が削除対象になります。rm html / unlink html と、スラッシュなしで指定します。
リンクの張り替え(上書き)
既にある名前でリンクを作ろうとすると File exists エラーになります。上書きするには -f を付けます。リンク名がディレクトリへのリンクの場合は、-n も付けないとリンク先ディレクトリの中に新しいリンクが作られてしまいます。
# current を release-2 から release-3 に切り替える(デプロイでよく使う形)
ln -sfn /opt/app/releases/release-3 /opt/app/current
落とし穴
- 相対パスの基準:
ln -s ../data/file.txt /tmp/linkのように相対パスで指定すると、その相対パスは「リンクが置かれた場所(/tmp)」から解決される。今いるディレクトリ基準ではない。迷ったら絶対パスで指定する - リンク切れ: 元を移動・削除するとシンボリックリンクは壊れる。
ls -lでは表示されるが、開くとNo such file or directoryになる - パーミッション: シンボリックリンク自身の権限表示(
lrwxrwxrwx)は意味を持たず、実際のアクセス権はリンク先で判定される - Web サーバー: Apache の
FollowSymLinksや Nginx の設定によっては、シンボリックリンク経由の公開ファイルが 403 になる - システムファイルのリンクを書き換えない:
/usr/bin/pythonなどを書き換えると OS のツールが壊れることがある(yum が動かなくなる例は関連記事を参照)
確認方法
# リンク先を表示
ls -l リンク名
readlink リンク名 # 記録されているパスをそのまま表示
readlink -f リンク名 # 最終的な実体の絶対パスを表示
# ハードリンクの確認(inode 番号と 2 列目のリンク数)
ls -li file1 file2
# ディレクトリ配下のシンボリックリンクを一覧
find /path -type l
# リンク切れのシンボリックリンクを探す(GNU find)
find /path -xtype l
よくある質問
Q. unlink と rm の違いは?
A. unlink は 1 つのファイル(リンク)を消すだけの単純なコマンドで、オプションや複数指定はできません。rm は複数指定や -i(確認)などが使えます。リンクを 1 つ消すだけならどちらでも同じ結果です。
Q. 作成に root 権限は必要?
A. リンクを置くディレクトリに書き込み権限があれば一般ユーザーでも作れます。/usr/local/bin などに置く場合は sudo が必要です。
関連
- 【yum エラー】File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:
- 環境変数の設定方法(PATH の通し方)
- Linux に Python をインストールする方法
- WSL2 完全ガイド
子ページはありません
- ls ファイル/ディレクトリ一覧表示
- sudo ユーザー指定
- cron/crontab ジョブの自動実行と登録方法
- wget http通信によるファイルダウンロード
- rm ファイル/ディレクトリ削除
- pwd カレントディレクトリの表示
- cd ディレクトリの移動
- ./configure
- make
- make install
- unzip ファイルの解凍
- mv ファイル/ディレクトリの移動および名称変更
- mkdir ディレクトリの作成
- touch 空ファイルの新規作成
- vi テキストディタの使用
- find ファイル/ディレクトリ検索
- grep 文字列の検索
- tail ファイルの末尾表示
- curl HTTP通信によるリクエスト
- nslookup ドメインのIP解決
- apt update パッケージリストの情報を更新
- apt upgrade パッケージの更新
- ln リンク/ショートカットの作成と削除
- rsync ファイル/ディレクトリの同期
- ssh リモートとの暗号化通信
- scp sshを利用したファイルのコピー
- unzip zip ファイルを解凍する
- cp ファイル/ディレクトリのコピー
- diffファイルの差分抽出
- fdisk ハードディスクに対する操作
- lsblk デバイスをツリー状で表示する
- kill プロセスを終了させる
- zip ファイルやディレクトリをzip形式に圧縮する
- hostコマンド
- chmod 権限の変更
- ip IPアドレスの確認
- chown コマンド(所有者の変更)
- chgrp ファイル/ディレクトリのグループ情報の変更
- nohupと'&' プログラムのバックグラウンド実行(ssh接続時)
- lsof 開いているポート番号の確認
- tar ファイルの圧縮と解凍
- file ファイルの種類を表示
- cat ファイルの中身を表示
- head ファイルの先頭部分を表示
- wc 行数/単語数/文字数を確認
- shutdown システムのシャットダウンと再起動
- ps プロセスの確認
- which コマンドの絶対パスを調べる
- yum RedHat系ディストリビューションの管理
- mount ファイルシステムのマウント
- 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
- 特定のフォルダとそのサブフォルダ内にある特定のファイル名のファイルを再帰的に削除
- sed テキスト処理用ストリームエディタ
- awk フィールド単位の柔軟なテキスト処理
- sort 行の並び替え
- uniq 重複行の除去・カウント
- cut 行から特定列を切り出し
- tr 文字の置換・削除
- less ページャでファイルを読む
- more 古典ページャ
- xargs 標準入力をコマンド引数に変換
- paste 複数ファイルを列方向に結合
- top プロセスの動的監視
- htop 強化版インタラクティブプロセス監視
- nice プロセスの優先度を指定して起動
- renice 実行中プロセスの優先度を変更
- jobs シェル管理下のジョブ一覧
- bg ジョブをバックグラウンドで実行
- fg バックグラウンドジョブをフォアグラウンドに
- killall プロセス名でまとめて終了
- pgrep プロセス名から PID を検索
- pkill プロセス名でシグナルを送信
- uname システム情報の表示
- uptime システム稼働時間とロードアベレージ
- free メモリ使用状況の表示
- df ディスク使用量 (ファイルシステム単位)
- du ディレクトリ・ファイル単位の使用量
- lscpu CPU 情報の表示
- lsmod 読み込み済みカーネルモジュール一覧
- lspci PCI デバイス一覧
- dmesg カーネルリングバッファの表示
- w ログイン中ユーザーと負荷の表示
- ping ホストへの到達性とラウンドトリップ確認
- traceroute ホストまでの経路を表示
- netstat ネットワーク接続・ルーティング表示 (旧式)
- ss netstat 後継、ソケット統計
- ifconfig ネットワークインターフェース表示・設定 (旧式)
- dig DNS リゾルバ問い合わせの定番
- route ルーティングテーブル表示 (旧式)
- iptables Linux パケットフィルタリング
- telnet TCP 接続診断・古典的リモートログイン
- arp ARP テーブルの表示・編集 (旧式)
- useradd ユーザーアカウントの作成
- usermod 既存ユーザーアカウントの変更
- userdel ユーザーアカウントの削除
- passwd パスワードの変更・管理
- groupadd グループの追加
- id ユーザーとグループの ID・所属を表示
- whoami 現在のユーザー名を表示
- su 別ユーザーに切り替え
- dnf Red Hat 系の次世代パッケージマネージャ (yum 後継)
- pacman Arch Linux のパッケージマネージャ
- echo 文字列・変数の出力
- export 環境変数の設定と継承
- alias コマンドの別名定義
- source / . スクリプトをカレントシェルで実行
- history コマンド履歴の表示・操作
- type コマンドの種別 (組み込み/関数/エイリアス/外部) を表示
- env 環境変数表示と一時設定でコマンド実行
- set シェルオプションと位置パラメータの操作
- unset 変数・関数の削除
- printf C 風書式付き出力
- systemctl systemd ユニットの管理
- service init.d 互換のサービス管理
- journalctl systemd ジャーナルログの参照
- crontab 定期実行ジョブの登録・編集
- at 指定時刻に 1 回だけコマンド実行
- umount ファイルシステムのアンマウント
- reboot システムを再起動
- halt システムを停止
- date 日付・時刻の表示と設定
- hostname ホスト名の表示・設定
- gzip ファイルを Deflate で圧縮
- gunzip gzip 圧縮ファイルの展開
- bzip2 高圧縮率の圧縮コマンド
- xz LZMA2 ベースの高圧縮コマンド
- zstd Facebook 製の高速圧縮コマンド
- dpkg Debian パッケージの低レベル操作
- rpm Red Hat パッケージの低レベル操作
- snap Canonical の sandbox パッケージマネージャ
- apt Debian/Ubuntu の高レベルパッケージマネージャ
- 7z 7-Zip コマンドラインツール
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15