システム上のファイルまたはディレクトリの検索に関しては、Linuxでのfindコマンドは比類のないものです。使い方は簡単ですが、ファイルの検索を微調整できるさまざまなオプションがあります。
このコマンドを使用してシステム上の何かを見つける方法の例を確認するために読んでください。 Linuxでfindコマンドを使用する方法を理解すれば、すべてのファイルを数回キーストロークするだけです。
ディレクトリを探す
-type dオプションを使用して、ディレクトリを具体的に検索するようにfindコマンドに指示できます。これにより、findコマンドは一致するディレクトリ名のみを検索し、ファイル名は検索しません。
$ find /path/to/search -type d -name "name-of-dir"
隠しファイルを探す
Linuxの隠しファイルと隠しディレクトリはピリオドで始まるため、隠しファイルと隠しディレクトリを再帰的に一覧表示するために、検索文字列でこの検索パターンを指定できます。
$ find /path/to/search -name ".*"
特定のサイズ以上のファイルを検索する
検索の-sizeオプションを使用すると、特定のサイズのファイルを検索できます。正確なサイズのファイル、特定のサイズよりも大きいまたは小さいファイル、または指定されたサイズ範囲に収まるファイルを検索するために使用できます。次にいくつかの例を示します。
サイズが10MBを超えるファイルを検索する:
$ find /path/to/search -size +10M
サイズが10MB未満のファイルを検索します:
$ find /path/to/search -size -10M
サイズが正確に10MBのファイルを検索します:
$ find /path/to/search -size 10M
サイズが100MBから1GBのファイルを検索します:
$ find /path/to/search -size +100M -size -1G
ファイルのリストから検索
検索する必要のあるファイルのリスト(たとえば、.txtファイル内)がある場合は、findコマンドとgrepコマンドを組み合わせてファイルのリストを検索できます。このコマンドを機能させるには、検索する各パターンが改行で区切られていることを確認してください。
$ find /path/to/search | grep -f filelist.txt
grepの-fオプションは「ファイル」を意味し、照合する文字列のファイルを指定できます。これにより、findコマンドは、リスト内の名前と一致するファイル名またはディレクトリ名を返します。
リストにないものを見つける
前の例で説明したのと同じファイルのリストを使用して、findコマンドを使用してではないファイルを検索することもできます。 テキストファイル内のパターンに合わせます。ここでも、findコマンドとgrepコマンドを組み合わせて使用します。 grepで指定された追加のオプションが必要です:
$ find /path/to/search | grep -vf filelist.txt
grepの-vオプションは「逆一致」を意味し、ファイルのリストで指定されたパターンのいずれにも一致しないファイルのリストを返します。
最大深度を設定
findコマンドは、デフォルトで再帰的に検索します。これは、指定したディレクトリで、指定したパターンと、検索するように指示したディレクトリ内のすべてのサブディレクトリを検索することを意味します。
たとえば、Linuxのルートディレクトリ(/)を検索するようにfindに指示すると、サブディレクトリのサブディレクトリがいくつ存在していても、ハードドライブ全体が検索されます。 -maxdepthオプションを使用すると、この動作を回避できます。
-maxdepthの後に数字を指定して、再帰的に検索するサブディレクトリの数を検索するように指示します。
現在のディレクトリでのみファイルを検索し、再帰的に検索しないでください:
$ find . -maxdepth 0 -name "myfile.txt"
現在のディレクトリとさらに深い1つのサブディレクトリでのみファイルを検索します:
$ find . -maxdepth 1 -name "myfile.txt"
空のファイル(長さがゼロ)を検索する
findを使用して空のファイルを検索するには、-emptyフラグを使用できます。空のファイルをすべて検索します:
$ find /path/to/search -type f -empty
空のディレクトリをすべて検索します:
$ find /path/to/search -type d -empty
findによって返される空のファイルまたはディレクトリを自動的に削除する場合は、このコマンドを-deleteオプションと組み合わせると非常に便利です。
ディレクトリ(およびサブディレクトリ)内のすべての空のファイルを削除します:
$ find /path/to/search -type f -empty -delete
最大のディレクトリまたはファイルを検索
システム上のどのファイルまたはディレクトリが最も多くのスペースを占めているかをすばやく判断したい場合は、findを使用して再帰的に検索し、ファイルやディレクトリのサイズ別に並べ替えたリストを出力できます。
ディレクトリ内の最大のファイルを表示する方法:
$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | tail -1
findコマンドが他の2つの便利なLinuxユーティリティであるsortとtailにソートされていることに注意してください。並べ替えコマンドはファイルのリストをサイズ順に並べ、tailコマンドはリストの最後のファイルのみを出力します。これも最大です。
たとえば、上位5つの最大のファイルを出力する場合は、tailコマンドを調整できます。
$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | tail -5
または、headコマンドを使用して、最小のファイルを決定することもできます。
$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | head -5
ファイルではなくディレクトリを検索する場合は、タイプオプションで「d」を指定するだけです。最大のディレクトリを表示する方法:
$ find /path/to/search -type d -printf "%s\t%p\n" | sort -n | tail -1
setuidセットファイルの検索
Setuidは、「実行時にユーザーIDを設定する」の略語であり、通常のユーザーが昇格された特権(rootなど)でプログラムを実行できるようにするファイル権限です。
これは明らかな理由でセキュリティ上の懸念事項になる可能性がありますが、これらのファイルは、findコマンドといくつかのオプションを使用して簡単に分離できます。
findコマンドには、特定の権限を持つファイルを検索するのに役立つ2つのオプション-userと-permがあります。通常のユーザーがroot権限で実行できるファイルを見つけるには、次のコマンドを使用できます。
$ find /path/to/search -user root -perm /4000
上のスクリーンショットでは、検索結果がで返されるファイルに関する出力をもう少し表示するために、-execオプションを含めました。コマンド全体は次のようになります:
$ find /path/to/search -user root -perm /4000 -exec ls -l {} \;
このコマンドの「root」を、所有者として検索する他のユーザーの代わりに使用することもできます。または、SUID権限を持つすべてのファイルを検索し、ユーザーをまったく指定しないこともできます:
$ find /path/to/search -perm /4000
sgidセットファイルを検索する
SGIDが設定されているファイルの検索は、SUIDのあるファイルの検索とほぼ同じですが、4000のアクセス許可を2000に変更する必要がある点が異なります。
$ find /path/to/search -perm /2000
permsオプションで6000を指定して、SUIDとSGIDの両方が設定されているファイルを検索することもできます。
$ find /path/to/search -perm /6000
許可なくファイルを一覧表示する
findコマンドを使用してファイルを検索するときは、検索するディレクトリとサブディレクトリに対する読み取り権限が必要です。そうでない場合、findはエラーメッセージを出力しますが、許可されているディレクトリ全体を引き続き調べます。
これは多くの異なるディレクトリで発生する可能性がありますが、ルートディレクトリを検索するときに間違いなく発生します。
つまり、ハードドライブ全体でファイルを検索しようとすると、findコマンドで大量のエラーメッセージが生成されます。
これらのエラーが表示されないようにするには、findのstderr出力をstdoutにリダイレクトし、それをgrepにパイプします。
$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"
このコマンドは、grepの-v(逆)オプションを使用して、「Permissiondenied」という行を除くすべての出力を表示します。
過去X日以内に変更されたファイルを検索する
findコマンドの-mtimeオプションを使用して、過去X日以内に変更されたファイルまたはディレクトリを検索します。また、X日より古いファイル、または正確にX日前に変更されたファイルの検索にも使用できます。
findコマンドで-mtimeオプションを使用する方法の例を次に示します。
過去30日以内に変更されたすべてのファイルを検索します:
$ find /path/to/search -type f -mtime -30
30日以上前に変更されたすべてのファイルを検索します:
$ find /path/to/search -type f -mtime +30
正確に30日前に変更されたすべてのファイルを検索します:
$ find /path/to/search -type f -mtime 30
findコマンドで、変更日など、検出したファイルに関する詳細情報を出力する場合は、-execオプションを使用して、lsコマンドを含めることができます。
$ find /path/to/search -type f -mtime -30 -exec ls -l {} \;
時間で並べ替え
検索結果をファイルの変更時刻で並べ替えるには、-printfオプションを使用して時刻を並べ替え可能な方法で一覧表示し、その出力を並べ替えユーティリティにパイプします。
$ find /path/to/search -printf "%T+\t%p\n" | sort
このコマンドは、古いファイルを新しいファイルに並べ替えます。新しいファイルを最初に表示する場合は、-r(逆)オプションを渡して並べ替えるだけです。
$ find /path/to/search -printf "%T+\t%p\n" | sort -r
検索と検索の違い
Linuxでのlocateコマンドは、システム上のファイルを検索するためのもう1つの優れた方法です。 findコマンドのように多数の検索オプションが含まれていないため、柔軟性は少し劣りますが、それでも便利です。
$ locate myfile.txt
Locateコマンドは、システム上のファイルのすべての名前を含むデータベースを検索することによって機能します。 updatebコマンドはこのデータベースを更新します。
Locateコマンドは、システム上のすべてのファイルのライブ検索を実行する必要がないため、findコマンドよりもはるかに効率的です。ただし、オプションがないことに加えて、別の欠点があります。ファイルのデータベースは1日に1回しか更新されません。
updatebコマンドを実行して、このファイルのデータベースを手動で更新できます。
$ updatedb
Locateコマンドは、ハードドライブ全体でファイルを検索する必要がある場合に特に便利です。これは、findコマンドは、すべてのディレクトリをリアルタイムでトラバースする必要があるため、当然、かなり時間がかかるためです。
多数のサブディレクトリが含まれていないことがわかっている特定のディレクトリを検索する場合は、findコマンドを使用することをお勧めします。
検索コマンドのCPU負荷
大量のディレクトリを検索する場合、findコマンドはリソースを大量に消費する可能性があります。本質的に、より重要なシステムプロセスを優先できるようにする必要がありますが、findコマンドが本番サーバーで使用するリソースを少なくする必要がある場合は、ioniceまたはniceコマンドを使用できます。
findコマンドのCPU使用率を監視します:
$ top
検索コマンドの入出力優先度を下げます:
$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"
検索コマンドのCPU優先度を下げます:
$ nice -n 19 find /path/to/search -name "myfile.txt"
または、両方のユーティリティを組み合わせて、I/OとCPUの優先度を低く抑えます。
$ nice -n 19 ionice -c2 -n7 find /path/to/search -name "myfile.txt"
チュートリアルがお役に立てば幸いです。戻ってきてください。