【find】コマンド(応用編)――タイムスタンプでファイルを検索する:Linux基本コマンドTips(32)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。前回に続き、今回も「find」コマンドを取り上げます。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、「find」コマンドでのタイムスタンプによるファイル検索と、慣れないと少々扱いにくい「-prune」の使い方を解説します。
findコマンドとは?
「find」は、場所を指定してファイルを検索するコマンドです。ファイル名だけではなく、ファイルの種類や更新日時など、細かい条件を指定して検索することができます。また、見つけたファイルに対して「アクション(コマンド)」を実行させることも可能です。
findコマンドの主なオプション
findコマンドの主なオプションは次の通りです。
| オプション | 意味 |
|---|---|
| -P | シンボリックリンクをたどらない(デフォルト) |
| -L | 全てのシンボリックリンクをたどる |
| -H | コマンドラインで指定したシンボリックリンクをたどる |
| -D オプション | 診断用の情報(デバッグ情報)を出力する。オプションには次の文字列が入る help:デバッグ用オプションの説明を表示 tree:検索式を構造化した情報 stat:statやlstatを使ってファイルを調べたときのメッセージ opt:検索式を最適化する際の情報 rates:各処理の成功した回数と失敗した回数を表示 |
| -Oレベル | 最適化レベル。「-O1」はファイル名による判別を先に行う(デフォルト)。「-O2」「-O3」では別の判定を先に行うなどで処理を高速化する |
findコマンドの主な検索式
findコマンドの主な検索式は次の通りです。
| 検索式 | 意味 |
|---|---|
| -name パターン | ファイル名がパターンと一致するファイル(「-name "*.txt"」のような指定が可能) |
| -iname パターン | -nameと同じだが、大文字小文字を区別しない |
| -lname パターン | シンボリックリンクのリンク先ファイル名がパターンと一致するファイル |
| -ilname パターン | -lnameと同じだが、大文字小文字を区別しない |
| -path パターン | パスがパターンと一致するファイル |
| -ipath パターン | -pathと同じだが、大文字小文字を区別しない |
| -regex パターン | ファイル名がパターンと一致するファイル、パターンに正規表現が指定可能 |
| -iregex パターン | -regexと同じだが、大文字小文字を区別しない |
| -type タイプ | ファイルタイプ(通常ファイルだけを対象としたい場合は「f」、ディレクトリは「d」、シンボリックリンクは「l」) |
| -xtype タイプ | -typeと同じだが、「-H」や「-P」が指定されている場合はリンク先のファイルタイプで判定する |
| -executable | 実行可能なファイルまたは検索可能なディレクトリ(-permと違いACLなども考慮する) |
| -readable | 読み込み可能なファイルにマッチする(-permと違いACLなども考慮する) |
| -writable | 書き込み可能なファイルにマッチする(-permと違いACLなども考慮する) |
| -fstype タイプ | ファイルが置かれているファイルシステムのタイプ(ufs、nfs、tmpなど) |
| 検索式 | 意味 |
|---|---|
| -mmin 分数 | 指定した分数より前に更新されたファイル(「-mmin 3」で3分前、「-mmin +3」で3分以上前、「-mmin -3」で3分以内に更新、以下同) |
| -mtime 日数 | 指定した日数より前に更新されたファイル |
| -newer ファイル | 指定したファイルの更新時刻以降に更新されたファイル |
| -amin 分数 | 指定した分数より前にアクセスされたファイル |
| -atime 日数 | 指定した日数より前にアクセスされたファイル |
| -anewer ファイル | 指定したファイルのアクセス時刻以降にアクセスされたファイル |
| -cmin 分数 | 指定した分数より前にステータスが変更されたファイル |
| -ctime 日数 | 指定した日数より前にステータスが変更されたファイル |
| -cnewer ファイル | 指定したファイルのステータス変更時刻にステータスが変更されたファイル |
| -daystart | -amin、-atime、-cmin、-ctime、-mmin、-mtimeで“今日”の始まりを今現在から24時間前ではなく、コマンド実行当日の0時にする |
| 検索式 | 意味 |
|---|---|
| -uid 数値 | 所有者のユーザーIDが指定した数値のファイル |
| -user 名前 | 所有者の名前が指定した名前のファイル |
| -gid 数値 | 所有グループID番号が指定した数値のファイル |
| -group 名前 | 所有グループ名が指定した名前のファイル |
| -nouser | ユーザーIDに対応するユーザーがいないファイル |
| -nogroup | ユーザーグループID番号に対応するグループがないファイル |
| -perm モード | パーミッションがモードと一致したファイル(「-モード」で指定したモードを全て許可しているファイル、「/モード」で指定したモードのいずれかを許可しているファイル) |
| -empty | 空のファイルまたは空のディレクトリ |
| -size サイズ | ファイルサイズが指定したサイズに一致したファイル(「-size +3k」でサイズが3KBより大きなファイル) |
| -links リンク数 | リンク数が指定したリンク数に一致したファイル |
| -inum 番号 | iノード番号が番号に一致したファイル |
| -samefile ファイル | 指定したファイルと同じiノード番号を参照しているファイル(「-L」オプションが有効な場合はシンボリックリンクも含まれる) |
| 検索式 | 意味 |
|---|---|
| 見つけたファイルをフルパスで出力する(デフォルト) | |
| -ls | 見つけたファイルを「ls -dgils」形式で出力する |
| -print0 | 見つけたファイルのフルパスをNULL区切りで出力 |
| -printf フォーマット | 見つけたファイルをフォーマットに従った書式で出力する |
| -fprint ファイル | -printと同じ書式で指定したファイルに出力する |
| -fls ファイル | -lsと同じ書式で指定したファイルに出力する |
| -delete | 見つけたファイルを消去する |
| -exec コマンド ; | 見つけたファイルを引数にコマンドを実行する(オプションも指定可能。以下同) |
| -execdir コマンド ; | 見つけたファイルのあるディレクトリでコマンドを実行する |
| -ok コマンド ; | 見つけたファイルを引数に、確認メッセージを表示しながらコマンドを実行する(オプションも指定可能、以下同) |
| -okdir コマンド ; | 見つけたファイルのあるディレクトリで、確認メッセージを表示しながらコマンドを実行する |
| -an、-a | 条件をANDで結ぶ |
| -or、-o | 条件をORで結ぶ |
| -not | 条件を否定する |
| -true | 常に真 |
| -false | 常に偽 |
| -quit | 直ちに終了する |
| -depth 深さ | 検索するディレクトリの深さを指定 |
| -maxdepth 深さ | 検索するディレクトリの最大の深さ(「-maxdepth 0」でコマンドラインで指定したディレクトリのみ検索) |
| -mindepth 深さ | 検索するディレクトリの最小の深さ(「-mindepth 1」でコマンドラインで指定したディレクトリより深いディレクトリを検索) |
| -prune | ディレクトリに降りない |
| -mount | 他のファイルシステムにあるディレクトリを探索しない |
| -noleaf | 「ディレクトリのハードリンク数から2を引いたものが、そのディレクトリに含まれるサブディレクトリの数である」という最適化を行わない |
タイムスタンプでファイルを検索する
「-mmin」で分数、「-mtime」で日数を指定して検索します。例えば、ちょうど1週間前、つまり7日前は「-mtime 7」、1週間以内に更新したファイルであれば「-mtime -7」、1週間以上前ならば「-mtime +7」のように指定します。
また、「-newer ファイル名」で、指定したファイルよりも新しいファイルを検索することも可能です。同様に、最終アクセス日を使う「-amin」「-atime」「-anewer」、ステータス更新日を使う「-cmin」「-ctime」「-cnewer」があります。
以下の実行例では、ホームディレクトリ「Documents」下にあるファイルで、“1週間以内に更新されたファイル”をリストアップしています(画面1)。ディレクトリを対象外とするため、「-type f」も同時に指定しています。
コマンド実行例
find ~/Documents -type f -mtime -7
除外するファイルやディレクトリを指定する
上記の実行例では、ドキュメントディレクトリ(「~/Documents」)を検索していますが、例えば、これをホームディレクトリ下で検索した場合、「.cache」ディレクトリや「.local」ディレクトリなどにある作業ファイルやログファイルが含まれてしまうかもしれません。
そこで、検索結果から“ドットファイル(隠しファイル)やドットディレクトリ(隠しディレクトリ)を除外”してみましょう(※)。「〜以外」と指定するには、幾つか方法があります。今回は「-prune」を使用します。
※「ドットファイル」は、ドット(.)から始まるファイル名を持つファイルのことで、「隠しファイル」とも呼ばれます。
- [参考]lsコマンド(ドットファイル/ディレクトリ編)――表示対象を指定する(本連載 第28回)
-pruneは、主に「条件1 -prune -o 条件2 -print」のように指定します。「条件1に合致したら何も行わない(ディレクトリの場合その中に降りない)」「条件2に合致したら出力する」という動作になります。「-o」は“または(条件をORで結ぶ)”という意味です。
ドットファイルは「-name ".*"」で指定できるので、先ほどの「-type f -mtime -7」と組み合わせて以下のように実行します(画面2)。
コマンド実行例
find ~ -name ".*" -prune -o -type f -mtime -7 -print
ちなみに、ドットディレクトリの中は表示したくないけど、ドットファイルは表示対象にしたい、という場合は「-name ".*" -type d」のように、「-type d」を追加して、「find ~ -name ".*" -type d -prune -o -type f -mtime -7 -print」とします。
筆者紹介
西村 めぐみ(にしむら めぐみ)
PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.

