コンピュータ科学において、シンボリックリンク(別名:シンボリックリンク、またはソフトリンク)とは、別のファイルまたはディレクトリへのパスを保存することで参照する特別なコンピュータファイルです。 [ 1 ]これにより、対象のコンテンツを複製することなく、代替アクセスパスが提供されます。オペレーティングシステムのサービスを使用するアプリは、シンボリックリンクを他のファイルやディレクトリと同様に扱う場合があり、その性質を調べない限り、それがシンボリックリンクであることを認識できません。シンボリックリンクは、リンク先が移動または削除されると壊れる可能性があります。
シンボリックリンクはUnix系オペレーティングシステムとMicrosoft Windowsでサポートされていますが、さまざまな制限があります。シンボリックリンクの代替として、ハードリンク、ショートカットファイル、Windowsシェルオブジェクトなどがあります。
シンボリック リンクは、特別な状況を除いて、パスが参照するファイル システム項目 (ターゲット)として扱われるファイル システムパスを格納する独立したファイルです。シンボリック リンクが削除されても、そのターゲットは影響を受けません。ターゲットが移動、名前変更、または削除されても、シンボリック リンクは自動的には更新または削除されません。そのターゲット パスは何も参照していないため、壊れている、孤立している、無効、またはぶら下がっていると表現される場合があります。シンボリック リンクは、ハード リンクとは異なります。ハードリンクは別のボリュームまたはファイル システム上のターゲットにリンクできませんが、シンボリック リンクはリンクできます。ハード リンクは常に既存のターゲットを参照しますが、シンボリック リンクは何も参照していないパスである可能性があります。
シンボリックリンクは1982年にBSD Unix 4.1aで導入されました。[ 2 ] POSIX標準では、FreeBSD、Linux、macOSなどのほとんどのUnix系オペレーティングシステムで見られるシンボリックリンクが定義されています。IBM 7090のCTSSは、 1963年に名前でリンクされたファイルをサポートしました。 [ 3 ] [ 4 ] [ 5 ] 1978年までに、 DECのミニコンピュータオペレーティングシステムとData GeneralのRDOSでいくつかのシンボリックリンクがサポートされました。
シンボリックリンクはコンテキスト依存型または可変型の形式で実装することができ、設定パラメータ、実行時パラメータ、その他の瞬間的な条件に応じてリンク先が変化する。可変シンボリックリンクはパス定義に変数名(ユーザー名や環境固有情報など)が埋め込まれており、標準のシンボリックリンクでは不可能な柔軟性を実現している。NetBSD 、DragonFly BSD、Domain/OSはこのようなリンクをサポートしている。[ 6 ] [ 7 ] [ 8 ] Tru64はコンテキスト依存型のシンボリックリンクを使用し、コンテキストはクラスタメンバー番号となる。Pyramid TechnologyのOSxオペレーティングシステムは条件付きシンボリックリンクをサポートしている。[ 9 ]
前述のコンテキスト依存のシンボリックリンクは、ファイルシステム階層を再構築し、より直感的またはアプリケーション固有のディレクトリ構造を可能にし、コアシステムの機能やユーティリティを再設計することなくファイルシステムを再編成するのに役立ちます。シンボリックリンク機能は、その性質上、階層型ファイルシステムをツリーではなく有向グラフにするため、本来は単純な操作に影響を与える可能性があります。たとえば、ディレクトリの親への移動は、シンボリックリンクでは確実に機能しない可能性があります。一部のUnixシェルは、経験的にツリー型の階層構造を維持しようとしますが、そのため、そのような経験則を持たず、オペレーティングシステムに依存してパスを操作する他のプログラムとは異なる結果を生成します。[ 8 ]
Windows 95にも同様の直感性に関する懸念がありましたが、シンボリック リンクを採用する代わりに、Windows シェル、特殊フォルダ、ショートカット ファイルが作成されました (詳細については、 「§ 代替手段」を参照してください)。
Unix系OSでは、lnシェルコマンドはハードリンク(link()API関数経由)[ 10 ]またはシンボリックリンク(symlink()関数経由)[ 11 ]を作成できます。シンボリックリンクを作成するコマンドの構文は次のとおりです。
ln -s "<ターゲットのパス>" "<リンクのパス>"理想的にはターゲットが存在する必要がありますが、存在しないターゲットへのシンボリック リンクが作成されることもあります。
次の例では、「foo」という空のファイルを作成し、次に「foo」を指す「bar」というシンボリック リンクを作成します。
$ touch foo $ ln -s foo bar ほとんどの操作は、リンクをターゲットのエイリアスとして扱います。たとえば、ファイルの内容にアクセスするシェル コマンドは、ターゲット ファイルの内容にアクセスします。ただし、ファイル管理操作はリンクまたはターゲットに対して操作を行うことができます。lstat()、[ 12 ] lchown()[ 13 ]、readlink()[ 14 ] API は、ターゲットではなく、リンク ファイルに直接適用されます。アプリ (たとえば、lsまたは) は、ターゲットではなくシンボリック リンクを区別して報告するのではなく、findを使用できます。およびAPI 関数はシンボリック リンクに対して操作するようにコーディングされているため、およびコマンド (これらの API を使用) はシンボリック リンク自体に影響します。コマンドには、シンボリック リンクまたはターゲットのいずれかをコピーできるオプションがあります。 lstat()stat()rename()unlink()rmmvcp
このls -lコマンドはシンボリックリンクのターゲットを表示できます。出力には、リンク名、マーク->、そしてリンクのターゲットが表示されます。この例では、ls前の例で作成されたシンボリックリンクが表示されています。
$ ls -l bar lrwxrwxrwx 1 ユーザーグループ 3 8月 4日 18:40 bar -> foo初期の実装では、リンク パスは通常のファイルに格納されていました。ファイルには対象のパスがテキストとして含まれており、ファイル モード ビットによってファイルがシンボリック リンクとしてマークされていました。このようなシンボリック リンクの報告されるサイズは、リンク先のパスの文字数です。シンボリック リンクのファイル システム パーミッションは使用されません。対象ファイルのアクセス モードは、対象ファイル自身のパーミッションによって制御されます。( FreeBSD、NetBSD、DragonFly BSD、およびmacOS は、それぞれ[ 15 ] [ 16 ] [ 17 ] [ 18 ]および[ 19 ] [ 20 ] [ 21 ] [ 22 ] APIを介して、シンボリック リンクのファイルパーミッションとファイル属性を変更できます。) lchmod()lchflags()
ストレージ容量とパフォーマンスを向上させるため、高速シンボリックリンクは、ディスク上のファイル情報を格納するために使用されるデータ構造( inode )内にターゲットパスを格納することを可能にしました。この領域には、ファイルに割り当てられたディスクブロックアドレスのリストが格納されます。そのため、ターゲットパスが短いシンボリックリンクは高速にアクセスできます。高速シンボリックリンクを使用するシステムでは、ターゲットパスが利用可能なinode領域を超える場合、多くの場合、元の方法にフォールバックします。元のスタイルは、遡及的に低速シンボリックリンクと呼ばれていました。また、他のオペレーティングシステムや古いバージョンのオペレーティングシステムとのディスク互換性のためにも使用されます。
リンク値をinode内に格納することでディスクブロックとディスク読み取りを節約できますが、オペレーティングシステムはリンク内のパス名を解析する必要があります。この解析には、常に追加のinodeの読み取りが必要となり、通常は他のディレクトリ(場合によっては複数のディレクトリ)の読み取りも必要になります。この処理では、リンクのパス構成要素と一致するものが見つかるまで、ファイルのリストと各ディレクトリのinodeの両方を処理します。リンクが同じディレクトリ内のファイルを指している場合にのみ、「高速シンボリックリンク」は他のシンボリックリンクよりも大幅に優れたパフォーマンスを提供します。
このセクションは、ReFSに関する情報を追加して拡張する必要があります。不足している情報を追加していただければ幸いです。 (2025年11月) |
Microsoft Windows は、NTFSおよびReFSファイル システム、および Windows カーネル名前空間内のシンボリック リンクをサポートしています。
Windows 2000以降、NTFSはジャンクションポイント[ 23 ](ソフトリンクとも呼ばれる)をサポートしています。[ 24 ]ジャンクションポイントはシンボリックリンクに似ていますが、ファイルではなくディレクトリにのみリンクします。これらはNTFS再解析ポイントによって実装されます。[ 24 ] Windows 7とVistaは、特定のパスに対して最大31個の再解析ポイントをサポートしています(つまり、Windowsが処理を中止するまでに、特定のパスは最大31個のリダイレクトを持つことができます)。[ 25 ]
また、2000年以降、NTFSはボリュームマウントポイントをサポートしています。通常、Windowsボリュームにはドライブ文字が割り当てられます。ボリュームマウントポイントは、ドライブ文字が割り当てられていない別のボリュームのルートへのシンボリックリンクのように機能します。
NTFSバージョン3.1ではシンボリックリンクのサポートが導入されました。Windows XPはNTFS 3.1を部分的に実装しており、シンボリックリンクは含まれていません。そのため、Windows XPでNTFSシンボリックリンクのサポートを有効にするには、サードパーティ製のドライバーが必要です。[ 26 ] Windows Vista以降ではシンボリックリンクのサポートが有効になっています。[ 27 ] NTFSジャンクションポイントとは異なり、シンボリックリンクはファイルまたはリモートサーバーメッセージブロック(SMB)ネットワークパスを指すこともできます。さらに、NTFSシンボリックリンクの実装では、ボリューム間のリンクが完全にサポートされています。ただし、ホスト間のシンボリックリンクを有効にする機能を使用するには、リモートシステムもそれらをサポートしている必要があります。
シンボリックリンクは、 POSIXオペレーティングシステムへの移行とアプリケーションの互換性を支援するために設計されています。Microsoftは、Windows Vistaのシンボリックリンクが「UNIXリンクと同じように機能する」ことを目指しました。 [ 27 ]シンボリックリンクを作成するには、ユーザーアカウントが新しい「シンボリックリンクの作成」権限(SeCreateSymbolicLinkPrivilege)を持っている必要があります。この権限は、デフォルトでは管理者のみが持っています。[ 28 ] Windows Vista以降では、作業ディレクトリのパスがシンボリックリンクで終わる場合、現在の親パス参照()は、..シンボリックリンクのターゲットディレクトリではなく、シンボリックリンクの親ディレクトリを参照します。
ユーザーはコマンドプロンプトまたはPowerShellを使用してシンボリックリンクを作成できます。以下のコマンドは、「 」という場所に「Downloads」というシンボリックリンクを作成し、E:\ユーザープロファイル内のダウンロードフォルダを参照します。これはmklink組み込みのシェルコマンドであるため、コマンドプロンプトでのみ機能します。
mklink /DE:\Downloads %UserProfile% \Downloads このコマンドのスイッチは、/Dファイルのシンボリックリンクではなくジャンクションポイントを要求します。このコマンドは、ターゲットが存在しない場合でも成功します。
次の PowerShell コマンドも、上記と同じソースとターゲットを持つシンボリック リンクを作成します。
New-Item -Path 'E:\Downloads' -ItemType 'SymbolicLink' -Value "$Env:UserProfile\Downloads"コマンドプロンプトとは異なり、PowerShell はソースオブジェクトのパスが無効な場合、エラーを返します。その代わりに、PowerShell はソースオブジェクトの種類を正しく判別し、適切な種類のシンボリックリンクを作成します。NTFS シンボリックリンクは、ファイルやフォルダーに加えて、代替データストリームを指すこともできます。次の例では、「 」というファイルのTest.txt「 」代替ストリームを指す「 」というシンボリックリンクを作成します。(この代替ストリームは、Web のマークです。)Zone.Identifier:$DATAnpcap-1.83.exe
New-Item -Path "E:\Test.txt" -ItemType 'SymbolicLink' -Value 'E:\npcap-1.83.exe:Zone.Identifier:$DATA'シンボリックリンクを作成する低機能関数は、 2008年に導入されたWindows APICreateSymbolicLink()の機能です。ファイルとディレクトリの両方のシンボリックリンクを作成できます。[ 29 ]その後、2021年にMicrosoftは.NET 6にメソッドとメソッドを導入しました。これらは無料でオープンソースです。[ 30 ] [ 31 ]File.CreateSymbolicLink()Directory.CreateSymbolicLink()
この記事には、カーネルシンボリックリンク(Win32名前空間()からNT名前空間へのリンク)に関する情報が不足しています。(2025年9月) \\GLOBAL?? |
Cygwin は、Windows ファイルシステムにおいて POSIX 準拠のシンボリックリンクをシミュレートします。Unix と同一のプログラミングおよびユーザーユーティリティインターフェース(上記参照)を使用しますが、シンボリックリンクの解決時に Cygwin が使用する追加情報を含む Windows ショートカット(.lnk ファイル)を作成します。Cygwin のシンボリックリンクは、解決方法に関しては POSIX 標準に準拠し、ディスク上での表現に関しては Windows 標準に準拠しています。
さらに、CygwinはネイティブWindowsシンボリックリンクをサポートするように設定することができ、Cygwinの外部でも制限なく使用することができます。[ 32 ]これには以下が必要です。
ただし、いくつかの違いがあります。Cygwinでは、作業ディレクトリやアイコンなどのショートカット関連情報を指定する方法がありません。これは、コマンドにそのようなパラメータを指定する場所がないためですln -s。標準的なMicrosoft .lnkファイルを作成するために、Cygwinはユーティリティmkshortcutとreadshortcutユーティリティを提供しています。[ 33 ]
Cygwinユーザーズガイドにはこのトピックに関するより詳しい情報が記載されています。[ 32 ] CygwinをベースにしたMSYS2にも同様のwinsymlinks設定がありますが、デフォルトではファイルのコピーになっています。[ 34 ]
次の表は、シンボリック リンク (UNIX ベースと Windows の両方)、ジャンクション ポイント (NTFS)、およびハード リンク (UNIX ベース) のさまざまな側面を比較しています。
| シンボリックリンク | ジャンクションポイント | ハードリンク | |
|---|---|---|---|
| リンクを削除するとターゲットも削除されますか? | いいえ | はい[ a ] | 減算後の 参照カウントが0の場合のみ |
| ターゲットを移動してもリンクは有効ですか? | いいえ | いいえ | はい |
| 相対パスは許可されますか? | はい | いいえ[ b ] | 該当なし |
| 異なるボリュームにリンクできますか? | はい | はい | いいえ |
| ファイルにリンクできますか? | はい[ c ] | いいえ | はい |
| ディレクトリにリンクできますか? | はい | 部分的[ d ] |
SeCreateSymbolicLinkPrivilege)が必要です。デフォルトでは、ユーザーアカウントが管理者である場合[ 35 ]、または開発者モードが有効になっている場合(Windows 10 v1703以降)に、この権限が付与されます。 [ 36 ]シンボリック リンクに類似した機能の実装。
MIT互換タイムシェアリングシステム( 1963年頃)と非互換タイムシェアリングシステムはどちらも、リンクファイルがあり、ターゲットファイルの名前はディレクトリエントリで指定されます。[ 3 ] [ 4 ] [ 5 ]
Data GeneralのNovaコンピュータ用RDOSは、「リンクエントリ」をサポートしています。これは、エントリの名前と別のファイルの名前の両方を含むディレクトリエントリであり、エントリの名前を使用してファイルを参照すると、別のファイルを参照します。[ 37 ]
シンボリックリンクを作成するコマンドは でmakelink、これはハードリンクにも使用されます。dos.library は、ファイルに対してのみ有効な操作を実行しようとすると、ターゲットがソフトリンクであることを示すエラーコードを内部的に返します。そのため、シンボリックリンクをたどるアプリケーションは、明示的にリンクをたどる呼び出しを行い、操作を再試行する必要があります。AmigaDOSシェルはリンクを自動的にたどります。
従来の Mac OSでは、アプリケーションやユーザーはエイリアスを使用できます。エイリアスは、シンボリック リンクとは異なり、ターゲットが同じボリューム上の別の場所に移動された場合でも、ターゲットを追跡します。(これは、Unix 系システムのいくつかのシェルの シェル コマンドエイリアスと混同しないでください。)
macOSもエイリアスをサポートしています。エイリアスはなどのUnix APIではサポートされていませんが、 CarbonおよびCocoa の高レベル API open()ではサポートされています。
OS/2オペレーティングシステムでは、シンボリックリンクはグラフィカルなWorkplace Shellのシャドウに似ています。しかし、シャドウは完全なオブジェクト指向システムオブジェクトモデルを採用しているため、単純なリンクよりもはるかに強力で堅牢です。例えば、シャドウは名前が変更されたり、リンクのオブジェクトまたはサブジェクトの位置が変更されたりしても、その機能を失うことはありません。[ 38 ]
一部のオペレーティングシステムのグラフィカルファイルブラウザでサポートされているショートカットは、シンボリックリンクに似ていますが、いくつかの重要な点で異なります。その違いの一つは、ショートカットをたどることができるソフトウェアの種類です。
メカニズムにはさまざまな機能もあります。
Windowsシェルでは、ファイルシステム上の通常のディレクトリを「ジャンクションポイント」として使用できます。[ 41 ]これらは Windows シェルに対しては透過的ですが、他の環境では役に立ちません。Windows では、フォルダのショートカットを実装する方法が2つあります。1つ目は、特別な命名規則を使用する方法です。フォルダのショートカットは、次の構文に従う必要があります。Name.{CLSID}[ 41 ] Windowsシェルは、名前全体を関連する CLSID の表示名に置き換えます。たとえば、はTest.{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}Windows デスクトップのショートカットになります。
2番目は次のことを要求している:[ 41 ]
PathMakeSystemFolder()。Desktop.iniファイルを配置します。例をDesktop.ini以下に示します。[.ShellClassInfo] CLSID2 = {0AFACED1-E828-11D1-9187-B532F1E9575D}シェルオブジェクト[ 43 ]またはシェルフォルダはWindowsレジストリで定義されており、一種のシンボリックリンクを実装するためにも使用できます。フォルダショートカットと同様に、シェルオブジェクトはWindowsシェルに対して透過的です。
以下は一般的なテンプレートです。{########-####-####-####-############}、、0x####は<Path>プレースホルダーです。
[ HKEY_CLASSES_ROOT \CLSID\{#######-####-####-####-#############}] @ = "表示名"[ HKEY_CLASSES_ROOT \CLSID\{#######-####-####-####-#############}\DefaultIcon] @ = "..." ; アイコンへのパス[ HKEY_CLASSES_ROOT \CLSID\{#######-####-####-####-#############}\InProcServer32] @ = "%SystemRoot%\\System32\\ShDocVw.Dll" "ThreadingModel" = "Apartment"[ HKEY_CLASSES_ROOT \CLSID\{#######-####-####-####-#############}\Instance] "CLSID" = "{0AFACED1-E828-11D1-9187-B532F1E9575D}"[ HKEY_CLASSES_ROOT \CLSID\{#######-####-####-####-#############}\Instance\InitPropertyBag] "Attributes" = 16進数: 15,00,00,00; 次のいずれかを指定できます: ; ; - 絶対ファイル システム パスを含む "Target"。; - "TargetKnownFolder" または "TargetSpecialFolder" も指定されている場合は、相対パスを含む "Target"。 ; - "TargetSpecialFolder" (相対パスを含む "Target" の有無にかかわらず)。; ターゲットの CSIDL を含める必要があります。; - "TargetKnownFolder" (相対パスを含む "Target" の有無にかかわらず)。; ターゲットの GUID を含める必要があります。; Windows Vista 以降でサポートされています。"Target" = "<パス>" "TargetSpecialFolder" = "0x####" "TargetKnownFolder" = "{#######-####-####-####-############}"[ HKEY_CLASSES_ROOT \CLSID\{#######-####-####-####-#############}\ShellFolder] "Attributes" = 16進数: 00,00,00,00デスクトップの「マイ ドキュメント」フォルダや、コントロール パネルの「フォント」フォルダおよび「管理ツール」フォルダは、ファイル システム フォルダにリダイレクトされる シェル オブジェクトの例です。
シンボリックリンク
や改良されたグループスキーム
など、他にも便利な機能がいくつかあります。
CTSSの開発に伴い、「共通ファイル」と「リンク」を通じて、ユーザーがディスク上のファイルを共有できる手段を提供してきました。
ファイル自体ではなく、他のUFDエントリを指すUFDエントリ
リンク: 形式はCopyと同様です。指定されたファイルはコピーされません。