どのシステムにもディレクトリとファイルの配置には一定のルールがある。システムに慣れてくるとどこに何が置いてあるかは手に取るようにわかるようになるが、ときにはど忘れしてしまうことだってある。今回は、そんなときに便利なコマンド「find」を紹介しよう。

名前を指定したら検索できるコマンド

findコマンドは、その名の通りファイルやディレクトリを探すためのコマンドだ。findコマンドにはさまざまなオプションが用意されており、さらにヒットした対象に対して別の処理を行うこともできる。このコマンド単体でもいろいろなことができるのだが、最初は「ファイル名を指定したら検索できるコマンド」、そんな程度に覚えておけばよいだろう。

例えば、サーバの設定ファイルには「.conf」という拡張子が付けられていることが多い。「あの設定ファイル、どこにあったっけ?」というときには、次のようにfindコマンドを実行すると設定ファイル一覧を表示できる。

[root@centos ~]# find /usr -name '*.conf'
/usr/lib/dracut/dracut.conf.d/50-nss-softokn.conf
/usr/lib/dracut/dracut.conf.d/01-dist.conf
/usr/lib/dracut/dracut.conf.d/02-rescue.conf
/usr/lib/dracut/dracut.conf.d/01-microcode.conf
/usr/lib/dracut/modules.d/98syslog/rsyslog.conf
...略...
/usr/share/alsa/firmware/usx2yloader/us122.conf
/usr/share/alsa/firmware/usx2yloader/us224.conf
/usr/share/alsa/firmware/usx2yloader/us428.conf
/usr/share/alsa/topology/broadwell/broadwell.conf
[root@centos ~]#

findコマンドの第1引数には、検索を開始するトップディレクトリ指定する。上記の例だと「find /usr」となっているので、/usr/以下のファイルやディレクトリが検索対象ということになる。

findコマンドでは、オプション「-name」で検索対象の名前を指定することができる。「-name ‘*.conf’」のように指定すれば、拡張子が「.conf」のパスを探すことができるわけだ。ほかにもオプションを指定していろいろな絞り込みが可能なのだが、findコマンドののオプションは覚えにくいので、パイプラインにつないでほかのコマンドでフィルタリングできるならそちらのほうが扱いやすいと思う。

例えば、先ほどの出力からさらにgrepコマンドでWPA関連のファイルを絞り込むと次のようになる。

[root@centos ~]# find /usr -name '*.conf' | grep -i wpa
/usr/share/doc/wpa_supplicant-2.0/examples/ieee8021x.conf
/usr/share/doc/wpa_supplicant-2.0/examples/openCryptoki.conf
/usr/share/doc/wpa_supplicant-2.0/examples/plaintext.conf
/usr/share/doc/wpa_supplicant-2.0/examples/udhcpd-p2p.conf
/usr/share/doc/wpa_supplicant-2.0/examples/wep.conf
/usr/share/doc/wpa_supplicant-2.0/examples/wpa-psk-tkip.conf
/usr/share/doc/wpa_supplicant-2.0/examples/wpa2-eap-ccmp.conf
/usr/share/doc/wpa_supplicant-2.0/wpa_supplicant.conf
[root@centos ~]#

いくつか覚えておくと便利なのは、-typeオプションで種類を指定できることと、-maxdepthオプションでパスの階層の深さを指定できることだろう。「-type f」だとファイルだけが出力されるようになり、「-type d」だとディレクトリだけが出力されるようになる。もしかしたら、「l」「p」「s」あたりを使うことがあるかもしれないが、とりあえずは「-type f」と「-type d」だけ覚えておけば、やりたいことは大体できると思う。

-maxdepthオプションはディレクトリの階層の最大の深さを指定するもので、例えばファイルのある場所は最大でもスタート地点から3ディレクトリ下までだとわかっていれば、それよりも下に関しては検索対象としない、といった絞り込みを行うことができる。データファイルの置いてあるパスの深さなどが概ねわかっている場合には便利なオプションだ。

検索を開始するディレクトリからその3階層下のディレクトリまでで、「.conf」の拡張子が付いたファイルを検索する場合は、以下のように指定して実行すればよい。

[root@centos ~]# find /usr -maxdepth 3 -type f -name '*.conf'

findコマンドの使い方としては、ヒットしたファイルのパーミッションを一括で変更するとか、コアダンプファイルや一時バックアップファイルのように削除しても問題のないゴミファイルを検出して削除する、更新時間の期間を指定して該当するファイルを取り出す……といったものが考えられる。

だが、実際の運用ではそういった使い方はあまりしない。自動削除やパーミッションの自動変換などは誤って実行されると困るので、結局いったんファイルに出力して確認してから作業したり、ほかのコマンドで置き換えて処理したりするからだ。

ただし、システムで定期的に動作するスクリプトではオプションがバリバリ指定されたfindコマンドが実行されていることも少なくない。findコマンドでどういったことができるかは知っておいたほうがよいだろう。findコマンドを使ったことがないという方は、ぜひ一度使ってみていただきたい。