ここから本文です

1分で解説、きょうのLinux基本コマンド講座:「findコマンド」(応用編その2)

@IT 7月20日(水)6時10分配信

連載目次

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、「find」コマンドで検索したファイルを指定したフォーマットで表示する方法と、空のファイルやディレクトリを確認しながら削除する方法を解説します。

【応用】rmコマンドでホームディレクトリ下の空のファイルを確認しながら削除する

●findコマンドとは?

 「find」は、場所を指定してファイルを検索するコマンドです。ファイル名だけではなく、ファイルの種類や更新日時など、細かい条件を指定して検索することができます。また、見つけたファイルに対して「アクション(コマンド)」を実行させることも可能です。

●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」オプションが有効な場合はシンボリックリンクも含まれる)

●アクション他
検索式 / 意味
-print / 見つけたファイルをフルパスで出力する(デフォルト)
-ls / 見つけたファイルを「ls -dgils」形式で出力する
-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を引いたものが、そのディレクトリに含まれるサブディレクトリの数である」という最適化を行わない

●検索したファイルを指定したフォーマットで表示する

 findコマンドで検索したファイルは「-print」(デフォルト)ではファイル名、「-ls」では「ls -dgils」相当のフォーマットで表示されますが、「-printf」で表示する書式を指定することもできます。

 例えば、「%f」ではファイル名だけが表示されるので、「-printf "%f\n"」と指定すると、ファイル名だけが1件1行表示されるようになります。なお、最後に「\n」を付けないと「改行なし」の指定となるため、ファイル名が続けて表示されることになります。

 以下の実行例では、サイズがゼロ(-empty)のファイル(-type f)を、「属性(%M)」「日付(%D)」「パス付きのファイル名(%p)」で表示しています(画面1)。

○コマンド実行例

find -type f -empty -printf "%M %TD %p\n"

 なお、findコマンドで指定できる主なフォーマット記号は以下の通りです。


●空のファイルやディレクトリを確認しながら削除する

 findコマンドでは「-exec」アクションを付けることで、任意のコマンドを実行させることができます(本連載第31回)。ファイルを削除する場合など、動作を確認しながら実行したいコマンドには「-ok」アクションを使用します。

 例えば、「rm」コマンドを実行したい場合は「-ok rm {} ;」のように指定します。「{}」部分にはfindコマンドで見つかったファイル名が入り、「;」が指定するコメントの最後となります。「;」はコマンドラインでは“コマンドの区切り”という意味になるので、下記の実行例のように「\」を付けます。「\」の前には空白(半角スペース)が必要な点にも注意してください。また、コマンドにオプションを付けたい場合は、通常通りの位置に入れます。

 以下の実行例では、rmコマンドに動作経過を表示する「-v」オプションを付けて、ホームディレクトリ下の空のファイルを確認しながら削除しています。

○コマンド実行例

find ~ -type f -empty -ok rm -v {} \;

 なお、自分で作成した覚えのないドットファイルやディレクトリなどは、X環境で動作しているコマンドなどが内部で使用していることがありますので、空でもむやみに削除しないようにしましょう。


●筆者紹介 西村めぐみ:PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。

最終更新:7月20日(水)6時10分

@IT

TEDカンファレンスのプレゼンテーション動画

暗闇で光るサメと驚くほど美しい海洋生物たち
波のほんの数メートル下で、海洋生物学者であり、ナショナルジオグラフィックのエクスプローラーかつ写真家のデビッド・グルーバーは、素晴らしいものを発見しました。海の薄暗い青い光の中で様々な色の蛍光を発する驚くべき新しい海洋生物たちです。彼と一緒に生体蛍光のサメ、タツノオトシゴ、ウミガメ、その他の海洋生物を探し求める旅に出て、この光る生物たちがどのように私たちの脳への新たな理解を明らかにしたのかを探りましょう。[new]