序章

シンボリックリンクを使用すると、ファイルやディレクトリを他のファイルやディレクトリにリンクできます。 それらは、シンボリックリンク、シェルリンク、ソフトリンク、ショートカット、エイリアスなど、多くの名前で呼ばれています。 ユーザーの観点からは、シンボリックリンクは通常のファイルやディレクトリと非常によく似ています。 ただし、それらと対話すると、実際にはもう一方の端のターゲットと対話します。 それらをファイルシステムのワームホールのように考えてください。

このガイドでは、シンボリックリンクとは何か、およびLinuxコマンドラインからシンボリックリンクを使用してそれらを作成する方法の概要を説明します。 ln 指図。

前提条件

このガイドに従うには、Linuxベースのオペレーティングシステムを実行しているコンピューターにアクセスする必要があります。 これは、SSHで接続した仮想プライベートサーバーまたはローカルマシンのいずれかです。 このチュートリアルは、Ubuntu 20.04を実行しているLinuxサーバーを使用して検証されていますが、示されている例は、任意のバージョンのLinuxディストリビューションを実行しているコンピューターで機能するはずです。

このガイドに従うためにリモートサーバーを使用する場合は、最初に初期サーバーセットアップガイドを完了することをお勧めします。 そうすることで、安全なサーバー環境がセットアップされます— root以外のユーザーを含む sudo 特権とUFWで構成されたファイアウォール—Linuxスキルを構築するために使用できます。

または、このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルコマンドを試すこともできます。 次のインタラクティブターミナルの起動!ボタンをクリックしてターミナルウィンドウを開き、Linux(Ubuntu)環境での作業を開始します。

ディレクトリとファイルの例の設定

シンボリックリンクを作成するために必要なシステムコールは、UnixライクなPOSIX準拠のオペレーティングシステムですぐに利用できる傾向があります。 リンクを作成するために使用するコマンドは、 ln 指図。

システム上の既存のファイルを使用してシンボリックリンクの作成を練習することはできますが、このセクションでは、このガイドの例に沿って実行できる練習環境を設定するいくつかのコマンドを提供します。

内にいくつかのディレクトリを作成することから始めます /tmp/ ディレクトリ。 /tmp/一時ディレクトリです。これは、サーバーが次に起動したときに、その中のすべてのファイルとディレクトリが削除されることを意味します。 これは、後でシステムを詰まらせることを心配することなく、必要な数のディレクトリ、ファイル、およびリンクを作成できるため、このガイドの目的に役立ちます。

以下 mkdir コマンドは一度に3つのディレクトリを作成します。 名前の付いたディレクトリを作成します symlinks/ 以内 /tmp/ ディレクトリ、および2つのディレクトリ(1つは名前付き one/ と別の名前 two/) 内部 symlinks/:

  1. mkdir -p /tmp/symlinks/{one,two}

新しいに移動します symlinks/ ディレクトリ:

  1. cd /tmp/symlinks

そこから、いくつかのサンプルファイルを作成します。1つは内の両方のサブディレクトリ用です。 symlinks/. 次のコマンドは、という名前のファイルを作成します one.txt 以内 one/ 内容が1行の読み取りのみであるサブディレクトリ one:

  1. echo "one" > ./one/one.txt

同様に、このコマンドはという名前のファイルを作成します two.txt 以内 two/ 内容が1行の読み取りのみであるサブディレクトリ two:

  1. echo "two" > ./two/two.txt

あなたが実行する場合 tree この時点で全体の内容を表示します /tmp/symlinks ディレクトリとネストされたサブディレクトリの場合、その出力は次のようになります。

  1. tree
Output
. ├── one │ └── one.txt └── two └── two.txt 2 directories, 2 files

:もし tree デフォルトではマシンにインストールされていません。システムのパッケージマネージャーを使用してインストールできます。 たとえば、Ubuntuでは、 apt:

  1. sudo apt install tree

これらのサンプルドキュメントを用意したら、シンボリックリンクの作成を練習する準備が整います。

デフォルトでは、 ln コマンドは、シンボリックリンクまたはソフトリンクの代わりにハードリンクを作成します。

テキストファイルがあるとします。 そのファイルへのシンボリックリンクを作成すると、そのリンクは元のファイルへのポインタにすぎません。 元のファイルを削除すると、ポイントするものがなくなったため、リンクが壊れます。

代わりに、ハードリンクはまったく同じ内容の元のファイルのミラーコピーです。 シンボリックリンクと同様に、元のファイルの内容を編集すると、それらの変更はハードリンクに反映されます。 ただし、元のファイルを削除しても、ハードリンクは引き続き機能し、元のファイルの通常のコピーと同じように表示および編集できます。

ハードリンクは世界でその目的を果たしますが、場合によっては完全に回避する必要があります。 たとえば、内部をリンクする場合は、ハードリンクの使用を避ける必要があります。 git 混乱を引き起こす可能性があるため、リポジトリ。

シンボリックリンクを作成していることを確認するために、 -s また --symbolic オプション ln 指図。

:シンボリックリンクは通常、ハードリンクよりも頻繁に使用されるため、エイリアスを作成すると便利な場合があります。 lnln -s:

  1. alias ln="ln -s"

これにより、数回のキーストロークしか節約できない場合がありますが、シンボリックリンクを多数作成している場合は、これが大幅に増える可能性があります。

前述のように、シンボリックリンクは、基本的に、ターゲットのファイル名とパスを含むファイルを作成するようなものです。 シンボリックリンクは元のファイルへの単なる参照であるため、元のファイルに加えられた変更は、シンボリックリンクですぐに利用できます。

シンボリックリンクの潜在的な用途の1つは、ユーザーのホームディレクトリに、Dropboxなどの外部アプリケーションに同期されているファイルを指すローカルディレクトリを作成することです。 もう1つは、動的に名前が付けられたディレクトリにあるプロジェクトの最新のビルドを指すシンボリックリンクを作成することです。

最初のセクションのサンプルファイルとディレクトリを使用して、先に進み、次の名前のシンボリックリンクを作成してみてください three それは one 以前に作成したディレクトリ:

  1. ln -s one three

これで、3つのディレクトリが作成され、そのうちの1つが別のディレクトリを指しています。 現在のディレクトリ構造のより詳細な概要を取得するには、 ls 現在の作業ディレクトリの内容を出力するコマンド:

  1. ls
Output
one three two

現在、内に3つのディレクトリがあります symlinks/ ディレクトリ。 システムによっては、それを意味する場合があります three 実際にはシンボリックリンクです。 これは、リンクの名前を別の色でレンダリングするか、リンクに追加することによって行われることがあります。 @ シンボル。

さらに詳細については、 -l への引数 ls シンボリックリンクが実際に指している場所を特定するには、次のようにします。

  1. ls -l
Output
total 8 drwxrwxr-x 2 sammy sammy 4096 Oct 30 19:51 one lrwxrwxrwx 1 sammy sammy 3 Oct 30 19:55 three -> one drwxrwxr-x 2 sammy sammy 4096 Oct 30 19:51 two

に注意してください three リンクが指している one 期待どおりのディレクトリ。 また、それはで始まります l、これはリンクであることを示します。 他の2つはで始まります d、通常のディレクトリであることを意味します。

シンボリックリンクには、シンボリックリンクを含めることもできます。 例として、 one.txt からのファイル threetwo ディレクトリ:

  1. ln -s three/one.txt two/one.txt

これで、という名前のファイルが作成されます。 one.txt の内側 two ディレクトリ。 以下で確認できます ls 指図:

  1. ls -l two/
Output
total 4 lrwxrwxrwx 1 sammy sammy 13 Oct 30 19:58 one.txt -> three/one.txt -rw-rw-r-- 1 sammy sammy 4 Oct 30 19:51 two.txt

端末の構成によっては、リンク(この出力例で強調表示されている)が赤いテキストで表示され、リンク切れを示している場合があります。 リンクは作成されましたが、この例でパスを指定する方法は相対的なものでした。 リンクが壊れているのは two ディレクトリにが含まれていません three ディレクトリと one.txt その中のファイル。

幸いなことに、あなたは言うことによってこの状況を改善することができます ln リンクの場所を基準にしてシンボリックリンクを作成するには、 -r また --relative 口論。

でも -r ただし、フラグを立てると、壊れたシンボリックリンクを修正できなくなります。 この理由は、シンボリックリンクがすでに存在し、を含めずに上書きすることはできないためです。 -f また --force 引数も:

  1. ln -srf three/one.txt two/one.txt

それで、あなたは今持っています two/one.txt リンクされていた three/one.txt これはへのリンクです one/one.txt.

このようなシンボリックリンクをネストするとすぐに混乱する可能性がありますが、多くのアプリケーションには、このようなリンク構造をより理解しやすくするための機能が備わっています。 たとえば、 tree コマンドの場合、表示されているリンクターゲットは実際には元のファイルの場所のターゲットであり、リンク自体ではありません。

  1. tree
Output
. ├── one │ └── one.txt ├── three -> one └── two ├── one.txt -> ../one/one.txt └── two.txt 3 directories, 3 files

物事がうまくリンクされたので、これらのサンプルファイルの内容を変更することにより、シンボリックリンクがファイルとどのように機能するかを探求し始めることができます。

ファイルに何が含まれているのかを理解するには、次のコマンドを実行します cat の内容を印刷するコマンド one.txt このガイドで作成した3つのディレクトリのそれぞれにあるファイル:

  1. cat {one,two,three}/one.txt
Output
one one one

次に、オリジナルの内容を更新します one.txt からのファイル one/ ディレクトリ:

  1. echo "1. One" > one/one.txt

次に、各ファイルの内容を再度確認します。

  1. cat {one,two,three}/one.txt
Output
1. One 1. One 1. One

この出力が示すように、元のファイルに加えた変更は、そのシンボリックリンクのいずれかに反映されます。

今、逆を試してみてください。 次のコマンドを実行して、シンボリックリンクの1つの内容を変更します。 この例では、の内容を変更します one.txt 内のファイル three/ ディレクトリ:

  1. echo "One and done" > three/one.txt

次に、各ファイルの内容をもう一度確認します。

  1. cat {one,two,three}/one.txt
Output
One and done One and done One and done

変更したシンボリックリンクは別のファイルへのポインタにすぎないため、リンクに加えた変更は、元のファイルと他のシンボリックリンクにすぐに反映されます。

結論

シンボリックリンクは非常に便利ですが、特定の制限があります。 元のファイルまたはディレクトリを移動または削除すると、それを指す既存のシンボリックリンクがすべて壊れてしまうことに注意してください。 そのシナリオでは自動更新はありません。 ただし、注意している限り、コマンドラインで作業を続けると、シンボリックリンクの多くの用途を見つけることができます。