1. はじめに
シンボリックリンクは、ファイルやディレクトリへの「別の場所からの入り口」を増やしつつ、実体を一か所にまとめておけるので、とても便利です。
ただ、リンクが増えてくると、次のようなことが気になります。
- どこにリンクを作ったか
- それぞれ何を参照しているか
- 参照先が今も存在するか
- 消えたり、壊れたリンクを復元したい
これらを簡単に解決するために作ったのが slink です。
slink は、シンボリックリンクを直感的かつ安全に作成すると同時に、作成したシンボリックリンクの場所と参照先を TOML ファイルで管理する macOS & Linux 向け CLI です。
作成したリンクの一覧表示、状態の確認、復元まで、コマンドで操作できます。すでにあるリンクを管理対象に追加することもできます。dotfiles に限らず、すべてのシンボリックリンクを手軽に管理できます。
kkensuke/slink
A CLI tool for macOS and Linux that safely creates and manages symbolic links based on a TOML file.
ln -s との違い
slink は、単にシンボリックリンクを作るだけでなく、作成時のミスを防ぎ、その後の管理まで行えるようにしています。
| 観点 | slink | ln -s |
|---|---|---|
| 相対パス入力 | target / link の両方を現在のディレクトリ基準で解釈 | target の文字列を基本的にそのままリンクに保存 |
| 相対リンク | -r で正しい相対パスを自動計算 | GNU/Linux は -r あり。macOS 標準 ln にはなし |
| 親ディレクトリ | -p で必要な親ディレクトリを作成 | 別途 mkdir -p が必要 |
| 既存ファイル・ディレクトリ | 誤って上書きせず、競合として停止 | オプションや配置先によっては削除・意図しない場所への作成が起こり得る |
| 直接の自己参照 | 検出して作成を拒否 | 作成できる |
| target が存在しない | リンクは作成できるが警告し、check でも検出 | dangling symlink をそのまま作成 |
| dry-run | -n で変更予定を確認 | 相当する標準機能なし |
| 作成後の管理 | 自動登録し、list / check / fix / remove で管理 | 状態管理なし |
つまり ln -s が「リンクを作るコマンド」なのに対し、slink は リンクを安全に作成し、その状態を継続して管理するためのコマンド です。
2. インストール
Homebrew からインストールできます。
brew install kkensuke/tap/slink次のコマンドでバージョンが表示されれば、インストール完了です。
slink --version3. まずは使ってみる
設定ファイルを事前に用意する必要はありません。まずは練習用のファイルで試してみましょう。
3.1. リンクを作成する
練習用のディレクトリとテキストファイルを用意します。
mkdir -p ~/slink-demo
cd ~/slink-demo
printf 'Hello, slink!\n' > hello.txthello.txt を参照するリンクを作ります。
slink hello.txt hello-link.txt基本形は次の通りです。
slink <参照先> <作成するリンク>今回の例では、hello.txt が実体で、hello-link.txt がその実体への入り口になります。
リンク経由で中身を読んでみましょう。
cat hello-link.txtOutput:
Hello, slink!元のファイルの内容が表示されます。hello.txt を編集すると、リンク経由で読む内容も変わります。
ディレクトリへのリンクも、同じ書き方で作成できます。
3.2. 登録したリンクを一覧表示する
slink で作成したリンクは、自動で管理対象に登録されます。
slink listリンクの配置先と参照先をまとめて確認できます。
3.3. リンクの状態を確認する
登録どおりのリンクがあり、参照先にもアクセスできるかを確認します。
slink check ~/slink-demo/hello-link.txt問題がなければ、次のように表示されます。
OK 1 links管理しているリンクをまとめて確認する場合は、パスを省略します。
slink check登録内容を見るのが list、実際の状態を確認するのが check です。
4. 管理ファイル
4.1. 保存場所を確認する
リンクの登録内容は、通常、次の TOML ファイルに保存されます。
~/.config/slink/links.toml実際に使用している管理ファイルの場所は、次のコマンドで確認できます。
slink --config管理ファイルは、リンクの作成や adopt による登録の際に自動で作成されます。
4.2. 管理ファイルを開く
macOS の既定のアプリで開くには、次のコマンドを使います。
open "$(slink --config)"VS Code の code コマンドが使える場合は、次のように開くこともできます。
code "$(slink --config)"4.3. 管理ファイルの内容
先ほどのリンクは、ホームディレクトリが /Users/you の場合、次のように記録されます。
[[link]]
link = "/Users/you/slink-demo/hello-link.txt"
target = "/Users/you/slink-demo/hello.txt"| 項目 | 内容 |
|---|---|
link | リンクを配置する場所 |
target | リンクの参照先 |
リンクが増えると、[[link]] のブロックが追加されます。
通常、slink で新しく作成するリンクの target は絶対パスで記録されます。ただし、-r / --relative を使うと、リンクの配置場所から見た相対パスを target として保存できます。
また、管理ファイルでは HOME を表す ${HOME} を使用できます。
[[link]]
link = "${HOME}/slink-demo/hello-link.txt"
target = "${HOME}/slink-demo/hello.txt"${HOME} または ${HOME}/... で始まる値だけが HOME 表現として解釈されます。~ や $HOME、その他の変数は展開されません。
slink が新しく追加・更新する HOME 配下の絶対パスも ${HOME} 表記で保存したい場合は、管理ファイルに次の設定を追加できます。
[format]
home = "expression"この設定を省略した場合は、従来どおり具体的な絶対パスを保存します。home = "expression" を指定しても、既存の項目を一括で書き換えることはなく、新しく作成・更新した項目だけに適用されます。また、相対 target は相対表記のまま保存されます。
普段の操作は slink のコマンドで行えますが、管理ファイルを開くと、登録したリンクの対応関係を直接確認・編集できます。
5. コマンド一覧
| コマンド | 説明 |
|---|---|
slink <target> <link> | リンクを作成し、参照先と配置先を登録する |
slink --config | 管理ファイルの場所を表示する |
slink list | 登録したリンクの一覧を表示する |
slink check [link ...] | 登録と実際のリンクを照合し、参照先にアクセスできるか確認する |
slink fix [link ...] | 登録内容に合わせてリンクを作成・修復する |
slink unregister <link ...> | リンクを残して、管理対象から外す |
slink remove <link ...> | 登録と一致するリンクを削除し、登録も解除する |
slink adopt <link ...> | 既存のリンクを管理対象に登録する |
slink scan [directory ...] | 指定したディレクトリの直下にあるリンクを探す |
[link ...] のように角括弧で囲まれた引数は省略できます。... は複数のパスを指定できることを表します。
checkとfixは、パスを省略すると登録済みの全リンクが対象になります。unregister・removeは、登録済みのリンクを指定します。adoptは、未登録のリンクを指定します。scanは、ディレクトリを省略すると現在のディレクトリを探索します。
6. オプション一覧
| 短縮形 | 長い形式 | 説明 |
|---|---|---|
-c | --config | 管理ファイルの場所を表示する |
-f | --force | 作成・fix で、参照先が異なる既存のリンクを置き換える。または登録・指定した target 表現を強制する |
-r | --relative | リンク作成時に、参照先をリンクの配置場所から見た相対パスとして保存・作成する |
-p | --parents | 作成・fix で、リンクを置くために不足している親ディレクトリを作成する |
-n | --dry-run | 作成・fix・unregister・remove・adopt の変更予定を、書き込まずに表示する |
-R | --recursive | scan でサブディレクトリも探索する |
-o | --format <形式> | list・check・scan の出力形式を指定する。human / tsv に対応し、既定は human |
-h | --help | ヘルプを表示する |
-V | --version | バージョンを表示する |
短いオプションは、-np や -rf のようにまとめて指定できます。
--config・--help・--version は、それぞれ単独で使います。--config は、別の設定ファイルを指定するオプションではなく、現在の管理ファイルの場所を表示するものです。
slink --help7. よく使う操作
7.1. dotfiles の設定をリンクする
例えば、Neovim の設定を ~/dotfiles/nvim にまとめ、Neovim が設定を探す ~/.config/nvim から参照させたい場合です。
参照先の ~/dotfiles/nvim に設定を用意したうえで、次のように実行します。
slink -p ~/dotfiles/nvim ~/.config/nvim-p を付けると、必要に応じて親ディレクトリの ~/.config を作成します。参照先の ~/dotfiles/nvim 自体を作成するオプションではありません。
これで、~/dotfiles/nvim に置いた設定を ~/.config/nvim 経由で利用できます。
実行前に変更予定を確認したい場合は、-n を付けます。
slink -np ~/dotfiles/nvim ~/.config/nvim内容を確認してから、-n を外して実行します。
7.2. 相対パスを使ったリンクを作成する
通常、slink はリンクの target に絶対パスを使います。-r / --relative を付けると、同じ参照先をリンクの配置場所から見た相対パスとして保存・作成できます。
例えば次の構成を考えます。
~/slink-demo/
├── hello.txt
└── links/~/slink-demo に移動して、次のように実行します。
cd ~/slink-demo
slink -r hello.txt links/hello-link.txthello.txt と links/hello-link.txt のどちらも、通常どおり現在のディレクトリを基準に解釈されます。--relative が変更するのは、リンクに保存する target の表現だけです。
作成されるリンクは次のようになります。
links/hello-link.txt -> ../hello.txt管理ファイルにも相対 target が保存されます。
[[link]]
link = "/Users/you/slink-demo/links/hello-link.txt"
target = "../hello.txt"すでに相対パスを使っているリンクを adopt した場合も、その相対表現を利用して登録できます。
7.3. 消してしまったリンクを復元する
登録済みのリンクは、fix で作り直せます。
先ほどの練習用リンクで試してみましょう。まず、リンクだけを削除します。
rm ~/slink-demo/hello-link.txtこの操作では、参照先の hello.txt は残ります。
続いて、登録内容からリンクを復元します。
slink fix ~/slink-demo/hello-link.txtリンク経由で読めることを確認します。
cat ~/slink-demo/hello-link.txtHello, slink!複数のリンクをまとめて復元したい場合は、対象のパスを省略できます。-n を付けると、実際には作成せずに何が起こるかを確認できます。
slink fix -n確認後に実行します。
slink fix7.4. すでにあるリンクを探して登録する
これまで ln -s などで作成したリンクも、slink の管理対象に追加できます。
例えば、~/.config の直下にあるリンクを探すには、次のようにします。
slink scan ~/.configサブディレクトリも含めて探す場合は、-R を付けます。
slink scan -R ~/.configscan は、まだ登録していないリンクも見つけられます。
見つかったリンクを管理対象に追加するには、adopt を使います。例えば、~/.config/nvim がすでにシンボリックリンクになっている場合は、次のように登録します。
slink adopt ~/.config/nvimリンク自体は変更せず、その場所と現在の参照先を登録します。
登録後は、ほかのリンクと一緒に list や check で確認できます。
slink check ~/.config/nvim7.5. リンクを削除する・管理対象から外す
練習用リンクが不要になったら、目的に応じて次のどちらかを使います。
リンクと登録を両方削除する場合は、remove を使います。
slink remove ~/slink-demo/hello-link.txt参照先の hello.txt は削除されません。
リンクを残して管理だけやめる場合は、unregister を使います。
slink unregister ~/slink-demo/hello-link.txtこちらはリンクをそのまま残し、list・check・fix の対象から外します。
さらに詳しい使い方は、github の README で確認してください。
kkensuke/slink
A CLI tool for macOS and Linux that safely creates and manages symbolic links based on a TOML file.