コマンドラインの基本:シンボリックリンク
序章
シンボリックリンクを使用すると、ファイルやディレクトリを他のファイルやディレクトリにリンクできます。 それらは、シンボリックリンク、シェルリンク、ソフトリンク、ショートカット、エイリアスなど、多くの名前で呼ばれています。 ユーザーの観点からは、シンボリックリンクは通常のファイルやディレクトリと非常によく似ています。 ただし、それらと対話すると、実際にはもう一方の端のターゲットと対話します。 それらをファイルシステムのワームホールのように考えてください。
このガイドでは、シンボリックリンクとは何か、およびLinuxコマンドラインからシンボリックリンクを使用してそれらを作成する方法の概要を説明します。 ln
指図。
前提条件
このガイドに従うには、Linuxベースのオペレーティングシステムを実行しているコンピューターにアクセスする必要があります。 これは、SSHで接続した仮想プライベートサーバーまたはローカルマシンのいずれかです。 このチュートリアルは、Ubuntu 20.04を実行しているLinuxサーバーを使用して検証されていますが、示されている例は、任意のバージョンのLinuxディストリビューションを実行しているコンピューターで機能するはずです。
このガイドに従うためにリモートサーバーを使用する場合は、最初に初期サーバーセットアップガイドを完了することをお勧めします。 そうすることで、安全なサーバー環境がセットアップされます— root以外のユーザーを含む sudo
特権とUFWで構成されたファイアウォール—Linuxスキルを構築するために使用できます。
ディレクトリとファイルの例の設定
シンボリックリンクを作成するために必要なシステムコールは、UnixライクなPOSIX準拠のオペレーティングシステムですぐに利用できる傾向があります。 リンクを作成するために使用するコマンドは、 ln
指図。
システム上の既存のファイルを使用してシンボリックリンクの作成を練習することはできますが、このセクションでは、このガイドの例に沿って実行できる練習環境を設定するいくつかのコマンドを提供します。
内にいくつかのディレクトリを作成することから始めます /tmp/
ディレクトリ。 /tmp/
は一時ディレクトリです。これは、サーバーが次に起動したときに、その中のすべてのファイルとディレクトリが削除されることを意味します。 これは、後でシステムを詰まらせることを心配することなく、必要な数のディレクトリ、ファイル、およびリンクを作成できるため、このガイドの目的に役立ちます。
以下 mkdir
コマンドは一度に3つのディレクトリを作成します。 名前の付いたディレクトリを作成します symlinks/
以内 /tmp/
ディレクトリ、および2つのディレクトリ(1つは名前付き one/
と別の名前 two/
) 内部 symlinks/
:
- mkdir -p /tmp/symlinks/{one,two}
新しいに移動します symlinks/
ディレクトリ:
- cd /tmp/symlinks
そこから、いくつかのサンプルファイルを作成します。1つは内の両方のサブディレクトリ用です。 symlinks/
. 次のコマンドは、という名前のファイルを作成します one.txt
以内 one/
内容が1行の読み取りのみであるサブディレクトリ one
:
- echo "one" > ./one/one.txt
同様に、このコマンドはという名前のファイルを作成します two.txt
以内 two/
内容が1行の読み取りのみであるサブディレクトリ two
:
- echo "two" > ./two/two.txt
あなたが実行する場合 tree
この時点で全体の内容を表示します /tmp/symlinks
ディレクトリとネストされたサブディレクトリの場合、その出力は次のようになります。
- tree
Output.
├── one
│ └── one.txt
└── two
└── two.txt
2 directories, 2 files
注:もし tree
デフォルトではマシンにインストールされていません。システムのパッケージマネージャーを使用してインストールできます。 たとえば、Ubuntuでは、 apt
:
- sudo apt install tree
これらのサンプルドキュメントを用意したら、シンボリックリンクの作成を練習する準備が整います。
ハードリンクを理解する
デフォルトでは、 ln
コマンドは、シンボリックリンクまたはソフトリンクの代わりにハードリンクを作成します。
テキストファイルがあるとします。 そのファイルへのシンボリックリンクを作成すると、そのリンクは元のファイルへのポインタにすぎません。 元のファイルを削除すると、ポイントするものがなくなったため、リンクが壊れます。
代わりに、ハードリンクはまったく同じ内容の元のファイルのミラーコピーです。 シンボリックリンクと同様に、元のファイルの内容を編集すると、それらの変更はハードリンクに反映されます。 ただし、元のファイルを削除しても、ハードリンクは引き続き機能し、元のファイルの通常のコピーと同じように表示および編集できます。
ハードリンクは世界でその目的を果たしますが、場合によっては完全に回避する必要があります。 たとえば、内部をリンクする場合は、ハードリンクの使用を避ける必要があります。 git
混乱を引き起こす可能性があるため、リポジトリ。
シンボリックリンクを作成していることを確認するために、 -s
また --symbolic
オプション ln
指図。
注:シンボリックリンクは通常、ハードリンクよりも頻繁に使用されるため、エイリアスを作成すると便利な場合があります。 ln
に ln -s
:
- alias ln="ln -s"
これにより、数回のキーストロークしか節約できない場合がありますが、シンボリックリンクを多数作成している場合は、これが大幅に増える可能性があります。
シンボリックリンクの操作
前述のように、シンボリックリンクは、基本的に、ターゲットのファイル名とパスを含むファイルを作成するようなものです。 シンボリックリンクは元のファイルへの単なる参照であるため、元のファイルに加えられた変更は、シンボリックリンクですぐに利用できます。
シンボリックリンクの潜在的な用途の1つは、ユーザーのホームディレクトリに、Dropboxなどの外部アプリケーションに同期されているファイルを指すローカルディレクトリを作成することです。 もう1つは、動的に名前が付けられたディレクトリにあるプロジェクトの最新のビルドを指すシンボリックリンクを作成することです。
最初のセクションのサンプルファイルとディレクトリを使用して、先に進み、次の名前のシンボリックリンクを作成してみてください three
それは one
以前に作成したディレクトリ:
- ln -s one three
これで、3つのディレクトリが作成され、そのうちの1つが別のディレクトリを指しています。 現在のディレクトリ構造のより詳細な概要を取得するには、 ls
現在の作業ディレクトリの内容を出力するコマンド:
- ls
Outputone three two
現在、内に3つのディレクトリがあります symlinks/
ディレクトリ。 システムによっては、それを意味する場合があります three
実際にはシンボリックリンクです。 これは、リンクの名前を別の色でレンダリングするか、リンクに追加することによって行われることがあります。 @
シンボル。
さらに詳細については、 -l
への引数 ls
シンボリックリンクが実際に指している場所を特定するには、次のようにします。
- ls -l
Outputtotal 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
からのファイル three
に two
ディレクトリ:
- ln -s three/one.txt two/one.txt
これで、という名前のファイルが作成されます。 one.txt
の内側 two
ディレクトリ。 以下で確認できます ls
指図:
- ls -l two/
Outputtotal 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
引数も:
- ln -srf three/one.txt two/one.txt
それで、あなたは今持っています two/one.txt
リンクされていた three/one.txt
これはへのリンクです one/one.txt
.
このようなシンボリックリンクをネストするとすぐに混乱する可能性がありますが、多くのアプリケーションには、このようなリンク構造をより理解しやすくするための機能が備わっています。 たとえば、 tree
コマンドの場合、表示されているリンクターゲットは実際には元のファイルの場所のターゲットであり、リンク自体ではありません。
- tree
Output.
├── one
│ └── one.txt
├── three -> one
└── two
├── one.txt -> ../one/one.txt
└── two.txt
3 directories, 3 files
物事がうまくリンクされたので、これらのサンプルファイルの内容を変更することにより、シンボリックリンクがファイルとどのように機能するかを探求し始めることができます。
ファイルに何が含まれているのかを理解するには、次のコマンドを実行します cat
の内容を印刷するコマンド one.txt
このガイドで作成した3つのディレクトリのそれぞれにあるファイル:
- cat {one,two,three}/one.txt
Outputone
one
one
次に、オリジナルの内容を更新します one.txt
からのファイル one/
ディレクトリ:
- echo "1. One" > one/one.txt
次に、各ファイルの内容を再度確認します。
- cat {one,two,three}/one.txt
Output1. One
1. One
1. One
この出力が示すように、元のファイルに加えた変更は、そのシンボリックリンクのいずれかに反映されます。
今、逆を試してみてください。 次のコマンドを実行して、シンボリックリンクの1つの内容を変更します。 この例では、の内容を変更します one.txt
内のファイル three/
ディレクトリ:
- echo "One and done" > three/one.txt
次に、各ファイルの内容をもう一度確認します。
- cat {one,two,three}/one.txt
OutputOne and done
One and done
One and done
変更したシンボリックリンクは別のファイルへのポインタにすぎないため、リンクに加えた変更は、元のファイルと他のシンボリックリンクにすぐに反映されます。
結論
シンボリックリンクは非常に便利ですが、特定の制限があります。 元のファイルまたはディレクトリを移動または削除すると、それを指す既存のシンボリックリンクがすべて壊れてしまうことに注意してください。 そのシナリオでは自動更新はありません。 ただし、注意している限り、コマンドラインで作業を続けると、シンボリックリンクの多くの用途を見つけることができます。