treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Linuxコマンド初心者向け:最も簡単なfindの解説

今日はLinuxのコマンド「find」コマンドの使い方をご報告します。
私が初心者の時代から使っている一番簡単な使い方~ちょっとした応用までの内容となります。

以下のような方へお勧めです。
Linuxを使い始めているがファイルを見失いがち
・ファイルを探したいけどコマンドが分からない
・とりあえずこれだけ覚えておけばいい、というオプションを知りたい

一番簡単な検索のかたち

冒頭にも記載しましたがコマンドは「find」を使います。
# find /
これで、全部のファイルを画面に表示します。
検索結果を絞り込むために「| grep %探したいキーワード%」を付けます。
# find / | grep %探したいキーワード%
こんな感じです。例えば「txt」という文字を探したい場合、
# find / | grep txt
とします。すると検索結果には「ファイル名に"txt"を含むファイル」が一覧表示されます。
これが一番簡単です。

ファイル名が一字一句間違いなく分かる場合

ファイル名が一字一句間違いなく分かれば、検索結果によけいなデータが含まれないようにできます。この場合には
# find / -name %ファイル名%
とします。例えばファイル名=readme.txtを探したい場合
# find / -name readme.txt
とします。システム内に含まれる「readme.txt」というファイルがすべて画面に表示されます。

ファイルの存在する場所が分かっている場合

ファイル名が分かっていて、なおかつどのディレクトリにあるかわかっている場合、もっと絞り込みできます。
/etc内の設定ファイルrsyncd.confを探す場合
# find /etc -name rsyncd.conf
と入力します。
これを実行すると
# find /etc -name rsyncd.conf
/etc/rsyncd.conf
#
このような画面表示で/etc配下を検索して検索結果としてファイルと場所が表示されます。

ファイル名の一部から検索する方法その2

一番簡単な検索方法で十分に探せますが、もう一つfindコマンドのオプションでもキーワード検索ができます。
一番最初のお題である「.txt」を含むファイルを検索する場合、
# find / -name *.txt
としても検索できます。「*」が全部を意味しています。

この方法ではデジカメ画像などでファイル名の一部が数字の連番の場合、もっと簡単な絞り込みもできます。
デジカメですと、DSC00001.JPGのように末尾が連番になっているので、
# find / -name DSC000??.JPG
と検索すると、「DSC00001.JPG~DSC00099.JPG」が検索可能です。
※実際にはDSC00ABC.JPGのようにアルファベットが含まれていても検索結果として表示されます。「?」が"何かしらの一文字"を意味しています。

ファイルの種類を絞り込む

ここまでの検索方法で、ある文字列のファイルやディレクトリであれば検索結果に全部表示されます。
ディレクトリを探しているのにファイルの検索結果が出てくるのはちょっと邪魔に思うかもしれません。この場合ディレクトリしか検索結果に出さないようにするためのオプションを付与します。
/etc配下になるhttpdというディレクトリを探す場合がこのコマンドです。
# find /etc -name httpd -type d
末尾の「 -type d」がディレクトリだけを探す、という命令になります。
これを「 -type f」と変更するとファイルだけを探すようになります。
# find /etc -name httpd -type f
-typeで指定するタイプによって検索結果が変わってくるようになります。「d」はディレクトリのd、「f」がファイルのfで覚えるとより絞り込めるようになります。
出力結果をちょっと比較してみましょう。
----------------------------------------------
# find /etc -name httpd -type d
/etc/httpd
# find /etc -name httpd -type f
/etc/rc.d/init.d/httpd
/etc/sysconfig/httpd
/etc/logrotate.d/httpd
#
----------------------------------------------

以前の記事でrsync動作で取得するバックアップの途中にシンボリックリンクが存在すると、リンク先のバックアップが取得できない、という話がありましたが、その時にシンボリックリンクを洗い出す場合には「-type l」オプションを使って探しました。いえ、どちらかというと、その時にfindコマンドをちょっと調べたから、この記事を書いた、という方が正しいです。
例えば/etc配下をバックアップしていたとして、シンボリックリンクを全部探そうとしたら、
# find /etc -type l
と、ファイル名などを指定せずに-type lだけを付けます。こうすると/etc配下のシンボリックリンクがすべて画面に表示されます。
この/etcの部分を探したいディレクトリ名に置き換えると、自分が探している場所にあるシンボリックリンクを全部洗い出せる、という動作をします。
シンボリックリンクはリンクのlで覚えるといいです。

探していて、エラーが出る場合

findコマンドを実行していてこんなエラーが出ることがあります。
find: /etc/cron.d: Permission denied
「Permission denied」というのはそのディレクトリ内を探そうとしたけどアクセス権がないから探せなかった、ということです。
つまりそのディレクトリ配下は検索をしていないので、検索漏れの可能性があります。
この場合、findコマンドの実行をアクセス権があるrootなどで実行しなければ完全な検索結果を表示することはできません。
単純に言えば、Permission deniedが出たらrootで検索、と覚えておけばOKです。

コマンドは奥が深いのですが、使いこなしていくと楽しくなってくるものです。ぜひLinux初心者の方はコマンド使いこなしの楽しさを知って、そのうちLinuxも使えるようになると無償のOSで得することがあるかもしれませんよ。