リンクが切れているシンボリックリンクを探せ‼

シンボリックリンクはファイルやディレクトリの整理や、すばやいアクセスをするのに便利な機能です。しかし、無計画にシンボリックを作成したり、過去の遺産のようなシステムを見てみると、リンクが切れてるものも多くあるかと思います。本記事では、このようなリンク切れのシンボリックの掃除などを行いたい人向けに、リンクが切れているシンボリックリンクをfindコマンドで調べる方法を紹介します。

TL;DR

findコマンドの-xtypeオプションにlを指定することで、リンクが切れているシンボリックリンクを調べることができます。※1(数字のイチ)ではなく、アルファベットのl(小文字のL)です。

$ find . -xtype l

もくじ

  1. 検証環境
  2. 事前準備
  3. ダメな例
  4. お勧めの例
  5. さいごに

検証環境

WSLのUbuntu 18.04で確認を行いました。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic

事前準備

初めに確認用のディレクトリ、ファイル、シンボリックリンクを作成します。

$ touch a.file
$ mkdir b.dir
$ ln -s a.file a.link
$ ln -s b.dir b.link
$ ln -s notexist c.link
$ ln -s notexistdir b.dir/d.link

ディレクトリ、ファイルの構成は以下のようになります。

$ tree --charset=C
.
|-- a.file
|-- a.link -> a.file
|-- b.dir
| `-- d.link -> notexistdir
|-- b.link -> b.dir
`-- c.link -> notexist

2 directories, 4 files

b.dir/d.linkとc.linkの2つがリンク切れになっています。

ダメな例

はじめに、リンク切れのシンボリックリンクを検索できないダメな例を紹介します。
findコマンドのtypeオプションでリンク(l)を指定して検索をしてみます。

$ find . -type l
./a.link
./b.dir/d.link
./b.link
./c.link

作成したシンボリックリンクがすべて表示されました。-typeオプションは検索対象がリンクであるかどうかのみを判断します。つまりリンク先のファイルタイプが何であるかまでは確認をしません。リンクそのものが検索対象となるので、リンクが切れていても検索に適合してしまいます。

続いて、findコマンドの-Lオプションを追加して、リンク先を検索対象としてみます。

$ find -L . -type l
./b.dir/d.link
./b.link/d.link
./c.link

-Lオプションと-type lオプションが指定された場合、リンク切れの場合のみ検索に適合します。つまりリンク切れのシンボリックリンクが表示されます。しかし、このオプションの場合、d.linkが2つ表示されています。これはd.linkが格納されているディレクトリが実態であるd.dirとシンボリックリンクであるb.linkの2つが存在するためです。
-Lオプションはリンク先をたどってくれますが、利用者が意図しない動作を引き起こす可能性もあります。-Lオプションを利用するときは、本当にリンク先を参照する必要があるのかを十分に検討してから利用したほうがようでしょう。

お勧めの例

find-xtypeオプションを利用します。
-xtypeオプションはファイルがシンボリックリンク以外の場合は、-typeと同じ動作をします。ファイルがシンボリックリンクの場合は、-xtypeで指定したタイプに対するリンクであれば検索に適合します。例えば、find . -xtype dの場合は、対象がディレクトリもしくはシンボリックリンクのリンク先がディレクトリであれば、検索に適合します。

$ find . -xtype d
.
./b.dir
./b.link

シンボリックリンクのリンク切れを確認するには、-xtype lを指定します。

$ find . -xtype l
./b.dir/d.link
./c.link

-xtype lは、”検査対象ファイルがシンボリックリンクで、リンク先がシンボリックリンク”というファイルを見つけます。しかし、”シンボリックリンクのリンク先がシンボリックリンク”というファイルは存在することがありません。シンボリックリンクのシンボリックリンクであっても、最終的に何かしらのファイルやディレクトリに紐づくことになります。”リンク先がシンボリックリンク”であるとは、最終的にファイルやディレクトリに紐づいていないリンクということになります。言い換えるとリンク先が切れたシンボリックリンクが検索に適合することになります。
まとめると、-xtype lは、ファイルがシンボリックリンクかつリンク切れの場合、Trueとなり検索に適合することになります。

さいごに

本記事では、リンクが切れているシンボリックリンクを探す方法としてfind . -xtype lを利用する方法を紹介しました。過去の歴史がわからないシステムなどには、おおくのリンク切れが見つかるかもしれません。過去の経緯がわからないと、消してもよいものなのかの判断も難しくなります。可能な限りコード化を行って、俗人的な設計や構築にならないようにしていきたいですね。

スカイアーチ ファンタジー研究室

スカイアーチ ファンタジー研究室

EasyDoggie

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。