本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「find」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、ファイルをさまざまな条件で検索する「find」コマンドの基本編です。
「find」は、場所を指定してファイルを検索するコマンドです。ファイル名だけではなく、ファイルの種類や更新日時など、細かい条件を指定して検索することができます。また、見つけたファイルに対して「アクション(コマンド)」を実行させることも可能です。
findコマンドの主なオプションは次の通りです。
オプション | 意味 |
---|---|
-P | シンボリックリンクをたどらない(デフォルト) |
-L | 全てのシンボリックリンクをたどる |
-H | コマンドラインで指定したシンボリックリンクをたどる |
-D オプション | 診断用の情報(デバッグ情報)を出力する。オプションには次の文字列が入る help:デバッグ用オプションの説明を表示 tree:検索式を構造化した情報 stat:statやlstatを使ってファイルを調べたときのメッセージ opt:検索式を最適化する際の情報 rates:各処理の成功した回数と失敗した回数を表示 |
-Oレベル | 最適化レベル。「-O1」はファイル名による判別を先に行う(デフォルト)。「-O2」「-O3」では別の判定を先に行うなどで処理を高速化する |
findはファイルを検索するコマンドですが、「式」を使うことで複数の条件を組み合わせたり、コマンドを実行させたりすることができます。
例えば、最もシンプルに「find」だけを実行するとカレントディレクトリ以下の全ファイルが、「find /etc」では「/etc」ディレクトリにある全てのファイルが表示されます。
ファイル名を指定して検索する場合は、「-name」オプションを使います。例えば、ホームディレクトリ下で名前に「bash」を含むファイルを検索する場合は、「find ~ -name "*bash*"」と指定します(画面1)。カレントディレクトリがホームディレクトリの場合は、「~」を省略できます。
find ~ -name "*bash*"
なお、ファイル名部分にワイルドカードを指定しない場合は、「-name bashrc」のように引用符(")を付けなくても構いません。「*bash*」の指定ではシェルが展開してしまう可能性があるので、それを防ぐために引用符を付け、「-name "*bash*"」のように指定しています。
大小文字を区別したくない場合は「-name」の代わりに「-iname」オプションを、正規表現を使う場合は「-regex」オプションを使用します。
「-name」や「-iname」「-regex」オプションで名前を指定した場合は、該当する名前のファイルだけではなく、ディレクトリも検索されます。ファイルだけを対象としたい場合は「-type f」オプション、ディレクトリを対象としたい場合は「-type d」オプション、シンボリックリンクを対象とするならば「-type l」オプションを使用します。
例えば、「find / -name profile -type f」を実行すると、ルートディレクトリ下(つまりシステム全体)から「profile」という名前のファイルが検索されます。
なお、検索場所に「/」を指定すると、権限のない場所も検索されて大量のエラーメッセージが表示されるので、「2>/dev/null」でエラーメッセージを“捨てる”(ヌルデバイスにリダイレクト)とよいでしょう。
以下の画面2の実行例では、「-type f」オプションの指定あり/なしで結果を比較しています。
find / -name profile -type f 2>/dev/null
findコマンドでは、検索式の他に「アクション」を指定して、コマンドを実行させることができます。デフォルトでは「-print」が実行されており、これは「ファイル名を表示する」というアクションになります。
「-ls」というアクションを指定すると、ファイルの詳しい情報が表示されます。これは「ls -dils」コマンド相当で表示される情報で、ファイルサイズなどが含まれるためにかなり長くなります。「ls -dF」くらいの情報量でよい場合は「-exec」アクションを使い、「-exec ls -dF {} ;」のように指定します。
execアクションは「-exec コマンド オプション {} ;」のように指定します。{}部分には、検索されたファイル名が入ります。ファイル名やディレクトリ名がそのまま入るので、lsコマンドは「-F」オプション(ファイルの種類によって「/」記号や「@」記号を付けて表示するオプション)だけではなく、ディレクトリそのものの情報を表示する「-d」オプションも付けています。
最後の「;」で、execアクションに対するコマンドの終わりを示します。コマンドラインでは「;」がコマンドの区切りとして機能してしまうため、実際に実行する際は「\;」のように指定します。直前に空白が必要な点も注意してください。
ここまでの説明をまとめると、次のようになります。
ここでは、「ルートディレクトリ下で名前がprofileであるものを探し、(1)では、-lsアクションで詳しい情報を表示する、(2)では、-execアクションでls -dFを実行する」という内容を指定しています。画面3の実行例は、以下の(2)のコマンドです。
find / -name profile -ls 2>/dev/null (1)
find / -name profile -exec ls -dF {} \; 2>/dev/null (2)
PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.