🔍

コマンドラインでリンク切れのシンボリックリンクを探す

2024/04/17に公開

Unix系のシンボリックリンクはファイルやディレクトリへのパスだけを保存しているので、これらを削除や改名や移動してもそれを追従しません。
ファイルを改名や移動をしたのにシンボリックリンクの修正を忘れたときに以下のコマンドが便利だったので記事にします。

find

カレントディレクトリ以下のリンク切れは以下のいずれかで見つかります。

find . -xtype l

# または
find -L . -type l

# または
find . -follow -type l

注意する点は引数の指定順です。
findは引数をfind [オプション] [パス] [評価式]の順番で指定する必要があります。
上の例では-Lはオプション、-follow-type l-xtype lは評価式です。
-L-followは効果は同様ですが指摘できる位置が異なります。
従って、find -xtype l .は実行しても失敗します。

-xtypeはGNU版だけで利用でき、-followは非推奨なことを考えると、find -L . -type lを使うのが一番良さそうです。

fd

fdでリンク切れを探すには以下のようにします。

# カレントディレクトリ以下
fd -L -t symlink

# 指定ディレクトリ以下
fd --follow --type symlink . ./src/

findと異なり-Lは単純に--followの短い形式です。
書式もfd [オプション] [パターン] [パス]なのでfindほどオプションの指定位置や順序を気にしなくてよさそうです。

終わりに

findは殆どの環境でデフォルトでインストールされますが、実装間のオプションの有無などの違いや引数の位置や順序など気にすべきことが色々と多く大変なので、インストールできるならfdを使う方が色々と楽だと思いました。

GitHubで編集を提案

Discussion