シンボリックリンクはファイルやディレクトリの整理や、すばやいアクセスをするのに便利な機能です。しかし、無計画にシンボリックを作成したり、過去の遺産のようなシステムを見てみると、リンクが切れてるものも多くあるかと思います。本記事では、このようなリンク切れのシンボリックの掃除などを行いたい人向けに、リンクが切れているシンボリックリンクをfind
コマンドで調べる方法を紹介します。
TL;DR
find
コマンドの-xtype
オプションにl
を指定することで、リンクが切れているシンボリックリンクを調べることができます。※1
(数字のイチ)ではなく、アルファベットのl
(小文字のL)です。
1 |
$ find . -xtype l |
もくじ
検証環境
WSLのUbuntu 18.04で確認を行いました。
1 2 3 4 5 6 |
$ lsb_release -a <span style="color: #999999">No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.2 LTS Release: 18.04 Codename: bionic</span> |
事前準備
初めに確認用のディレクトリ、ファイル、シンボリックリンクを作成します。
1 2 3 4 5 6 |
$ 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 |
ディレクトリ、ファイルの構成は以下のようになります。
1 2 3 4 5 6 7 8 9 10 |
$ tree --charset=C <span style="color: #999999">. |-- a.file |-- <span style="color: #00ffff">a.link</span> -> a.file |-- <span style="color: #99ccff">b.dir</span> | `-- <span style="color: #ff0000">d.link</span> -> notexistdir |-- <span style="color: #00ffff">b.link</span> -> <span style="color: #99ccff">b.dir</span> `-- <span style="color: #ff0000">c.link</span> -> notexist 2 directories, 4 files</span> |
b.dir/d.linkとc.linkの2つがリンク切れになっています。
ダメな例
はじめに、リンク切れのシンボリックリンクを検索できないダメな例を紹介します。
find
コマンドのtype
オプションでリンク(l
)を指定して検索をしてみます。
1 2 3 4 5 |
$ find . -type l <span style="color: #999999">./a.link ./b.dir/d.link ./b.link ./c.link</span> |
作成したシンボリックリンクがすべて表示されました。-type
オプションは検索対象がリンクであるかどうかのみを判断します。つまりリンク先のファイルタイプが何であるかまでは確認をしません。リンクそのものが検索対象となるので、リンクが切れていても検索に適合してしまいます。
続いて、find
コマンドの-L
オプションを追加して、リンク先を検索対象としてみます。
1 2 3 4 |
$ find -L . -type l <span style="color: #999999">./b.dir/d.link ./b.link/d.link ./c.link</span> |
-L
オプションと-type l
オプションが指定された場合、リンク切れの場合のみ検索に適合します。つまりリンク切れのシンボリックリンクが表示されます。しかし、このオプションの場合、d.link
が2つ表示されています。これはd.link
が格納されているディレクトリが実態であるd.dir
とシンボリックリンクであるb.link
の2つが存在するためです。
-L
オプションはリンク先をたどってくれますが、利用者が意図しない動作を引き起こす可能性もあります。-L
オプションを利用するときは、本当にリンク先を参照する必要があるのかを十分に検討してから利用したほうがようでしょう。
お勧めの例
find
の-xtype
オプションを利用します。
-xtype
オプションはファイルがシンボリックリンク以外の場合は、-type
と同じ動作をします。ファイルがシンボリックリンクの場合は、-xtype
で指定したタイプに対するリンクであれば検索に適合します。例えば、find . -xtype d
の場合は、対象がディレクトリもしくはシンボリックリンクのリンク先がディレクトリであれば、検索に適合します。
1 2 3 4 |
$ find . -xtype d <span style="color: #999999">. ./b.dir ./b.link</span> |
シンボリックリンクのリンク切れを確認するには、-xtype l
を指定します。
1 2 3 |
$ find . -xtype l <span style="color: #999999">./b.dir/d.link ./c.link</span> |
-xtype l
は、”検査対象ファイルがシンボリックリンクで、リンク先がシンボリックリンク”というファイルを見つけます。しかし、”シンボリックリンクのリンク先がシンボリックリンク”というファイルは存在することがありません。シンボリックリンクのシンボリックリンクであっても、最終的に何かしらのファイルやディレクトリに紐づくことになります。”リンク先がシンボリックリンク”であるとは、最終的にファイルやディレクトリに紐づいていないリンクということになります。言い換えるとリンク先が切れたシンボリックリンクが検索に適合することになります。
まとめると、-xtype l
は、ファイルがシンボリックリンクかつリンク切れの場合、Trueとなり検索に適合することになります。
さいごに
本記事では、リンクが切れているシンボリックリンクを探す方法としてfind . -xtype l
を利用する方法を紹介しました。過去の歴史がわからないシステムなどには、おおくのリンク切れが見つかるかもしれません。過去の経緯がわからないと、消してもよいものなのかの判断も難しくなります。可能な限りコード化を行って、俗人的な設計や構築にならないようにしていきたいですね。
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?