Linuxのfindとは
Linuxのfindとは、ディレクトリパスに存在するファイルやディレクトリ、シンボリックリンクなどを検索するコマンドです。サーバ向けのUNIX系システムに、標準搭載されているコマンドです。ここでは、findの概要と主なコマンドの使い方について解説します。
Linuxのfindの概要
Linuxのfindは、ファイルやディレクトリを検索し表示するコマンドです。現在のワーキングディレクトリあるいはディレクトリパスを指定し、条件に合致するファイルやディレクトリを表示したり特定のコマンドを実行したりすることができます。
また、検索ディレクトリの深さも指定可能で、再帰的検索条件を指定することもできます。
Linuxのfindを使ってみる
Linuxのfindコマンドは、条件指定を要望に合わせて行うことができます。指定できる引数は、man pageで確認できます。引数で指定できるパラメータは非常に多いため、最初は難しく感じるかもしれません。
そこで、ここでは主に使用するおすすめの使い方をピックアップし、条件を指定して実行していきます。今回、動作の確認はWSLで行い、実行結果に基づいて解説します。
findの基本構文
ここでは、findの基本構文を学んでいきます。man pageを見ると、findコマンドの構文は次のように表示されます。
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
前半の “[-H] [-L] [-P] [-D debugopts] [-Olevel]” は、[オプション]と同じ意味です。これらの[オプション]は、特殊な表示やデバッグに用いるため通常指定する必要がありません。そこで、ここでは用法を簡素化して次のように構文を紹介します。
find [パス...] [評価式]
[パス...]は、1つ以上のディレクトリパスが指定できます。パスに ”/” を指定するとルートディレクトリが指定され、全ディレクトリが検索対象となります。
指定がない場合は、現在のワーキングディレクトリが対象となります。[評価式]は、非常に多くの引数から構成されています。引数を未指定の時は ”-print” が設定されます。
findコマンドを引数なしで実行する
findコマンドは、引数なしでも実行できます。findコマンドを全く引数なしに実行した場合は、現在のワーキングディレクトリ配下のファイルやサブディレクトリ、シンボリックリンクなどが再帰的に1番下の階層のディレクトリまで表示されます。
このように引数なしでもcdコマンドでディレクトリを移動すれば、任意のパスのファイルやディレクトリの表示ができます。実際によく使う引数は、以降で解説していきます。
特定のファイル名を探して表示する
findコマンドを使う場合は、この目的で使用する人が多いはずです。特定のファイル名を探して表示するには、ファイル名を ”-name” で指定します。用法は次の通りです。
find [パス...] -name ファイル名
次の例は、WSLのマウントポイント /mnt/wslg/doc に格納されているテキストファイル ”*.txt” のファイル名を表示します。 ”*.txt” はワイルドカードを使った例で、 ”.txt” で終わる全てのファイルを意味します。
find /mnt/wslg/doc -name ”*.txt”
実行結果は次の通りです。抽出数が多いので、一部を省略しています。
/mnt/wslg/doc/dbus-1.15.2/system-activation.txt
/mnt/wslg/doc/fontconfig-2.13.95/fontconfig-devel.txt
/mnt/wslg/doc/fontconfig-2.13.95/fontconfig-user.txt
:
(中略)
:
/mnt/wslg/doc/systemd/LICENSES/OFL-1.1.txt
/mnt/wslg/doc/systemd/LICENSES/lookup3-public-domain.txt
/mnt/wslg/doc/systemd/LICENSES/murmurhash2-public-domain.txt
特定のファイル名を探して該当ファイル数を表示する
特定のファイル名を探して該当ファイル数を表示することは、よく使われる手法です。該当するファイルの数を確認するには最後に ”| wc -l” を追加すると表示された行数を返します。検索で該当した数が簡単に分かります。
user@host:/tmp$ find /mnt/wslg/doc -name "*.txt" | wc -l
45
user@host:/tmp$
ファイルやディレクトリを種類別に表示する
ファイルやディレクトリなどの種類を指定して集計することもできます。 ”-type” のあとにファイルは ”f” 、ディレクトリは ”d” 、そしてシンボリックリンクは ”l" を指定します。その他にスペシャルファイルやパイプファイルなどを指定することもできます。
以下は、最初にファイルを表示し、次にディレクトリを表示する例です。
find [パス...] -type f
find [パス...] -type d
ファイルやディレクトリのタイムスタンプを確認して表示する
ファイルやディレクトリには、作成時間や更新時間、そして参照時間が格納されています。作成時間は ”-ctime” 、更新時間は ”-mtime” 、参照時間は ”-atime” で指定することができます。
指定の際には、引数の指定の後に24時間の時間、つまり日数を正または負の符号をつけて実行します。例えば、3日以内に更新したファイルを確認する場合は、次のように負の符号をつけて実行します。
find [パス...] -mtime -3
1年以上更新されていないファイルを表示するには正の符号をつけて実行します。
find [パス...] -mtime +365
大きいファイルサイズを表示する
バックアップをとったり削除したりする際は、ファイルサイズを確認することが多いでしょう。ファイルサイズは、 ”-size” で指定します。ファイルサイズの単位は、 ”K” がキロバイト、 ”M” がメガバイト、 ”G” がギガバイトです。この他にブロックサイズやバイトやワードも指定できます。
例えば、ファイルサイズが500メガバイト以上を抽出する場合は、次のように指定します。
find [パス...] -size +500M
検索したファイル名やディレクトリ名を使って別のコマンドを実行する
検索したファイル名やディレクトリ名を使って別のコマンドを実行するには、 ”-exec” を指定します。 ”-exec” の後にコマンド名と引数などを指定します。ファイル名は ”{}” で引き継ぐことができます。実行の終了は ";” を指定します。
例えば、 ”*.txt” のテキストファイルで ”Manual” の記載を含むファイルを抽出するには、次のように実行します。
find [パス...] -name "*.txt" -exec grep -l "Manual" {} \;
WSLのフォルダを用いて、実際に実行した例は、次の通りです。grepコマンドは引数に ”-l” を指定し、該当した場合はファイル名のみ表示するよう指定しています。
user@host:/tmp$ find /mnt/wslg/doc -name "*.txt" -exec grep -l "Manual" {} \;
/mnt/wslg/doc/mesa/_extra/specs/INTEL_shader_atomic_float_minmax.txt
/mnt/wslg/doc/pcre-8.45/pcre-config.txt
/mnt/wslg/doc/pcre-8.45/pcre.txt
/mnt/wslg/doc/pcre-8.45/pcregrep.txt
/mnt/wslg/doc/pcre-8.45/pcretest.txt
user@host:/tmp$
その他の引数の概要
findコマンドは、評価式で用いる引数が非常に多く定義されています。すべては紹介できませんが、その他の引数も簡単に紹介しておきます。
・空のファイルやディレクトリを表示する 空のファイルやディレクトリを表示するには、 "-empty” を指定します。用法は引数のみで追加オプションは要りません。
・ファイルのオーナーやグループを指定する ファイルのオーナーは ”-user ユーザ名” 、グループは ”-group グループ名” で指定できます。
・ファイルのパーミッションで指定する ファイルのパーミッションで指定するには、 ”-perm 755” などのように指定します。
・検索ディレクトリの深さを指定する 検索ディレクトリの深さを指定すると、検索の範囲を指定できます。指定したパスの最上位の階層が深さ1を指し、最大(maxdepth)と最小(mindepth)が指定できます。
”-maxdepth 10” とすると、10階層までのディレクトリが検索対象となります。 ”-mindepth 3” とすると、3階層目以降のディレクトリを検索対象とします。
複数の引数を組み合わせて高度な検索を行う
findの引数は、組み合わせて高度な検索に使用できます。これまでに学んだ使い方を組み合わせてどのようなことができるのか確認していきます。
例えば、60日以上参照されていないアプリのログはアーカイブ用ディレクトリに移動し、その後1年以上参照されていないファイルは、サイズが10メガバイト以上の場合削除するとします。このような場合、次のように行うことができます。ここでのファイル名は、 ”app*.log” とします。
find /アプリ/ログ -type f -name “app*.log” -atime +60 -exec mv {} /アプリ/アーカイブ \;
find /アプリ/アーカイブ -type f -name “app*.log” -atime +365 -size +10M -delete
移動は、mvコマンドを使用しますが、正常動作を確認するまでは、移動ではなくコピーを行うcpコマンドで実験することをおすすめします。間違えて削除してしまうのを防止するために、あらかじめfindコマンドの引数の使い方を確認しておきましょう。
Linuxのfindコマンドは多機能です
Linuxのfindコマンドには、非常に多くの引数が定義されています。日常で必要なファイルやディレクトリの検索は、findコマンドで十分カバーされます。普段使う引数を覚えておくと、作業効率が高まるのでおすすめです。
その他の関連記事
その他に関連する内容は、下記の記事でもご紹介しています。ぜひ参考にご覧ください。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから