【 find 】コマンド(応用編その2)――検索したファイルを指定したフォーマットで表示するLinux基本コマンドTips(33)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。前回、前々回に続き、今回も「find」コマンドを解説します。

» 2016年07月20日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

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

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」形式で出力する
-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を引いたものが、そのディレクトリに含まれるサブディレクトリの数である」という最適化を行わない


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

 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"


画面1 画面1 サイズがゼロのファイルを「属性」「日付」「パス付きのファイル名」で表示しているところ

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


●findコマンドで指定できる主なフォーマット記号
記号 意味
\n 改行文字
\t 水平タブ
\\ バックスラッシュ文字そのもの
\8進数 ASCIIコードを指定
%p ファイル名(フルパス)
%P ファイル名(コマンドライン引数で指定した起点からの相対パス)
%f ファイルのパス名を除いたファイル名
%h ファイル名のディレクトリ部分
%H ファイル名のディレクトリ部分(コマンドライン引数で指定した起点からの相対パス)
%l シンボリックリンクの参照先
%m ファイルの許可属性ビット(8進数表示、0入りで表示したい場合は「%#m」)
%M ファイルの許可属性(「ls -l」と同じアルファベットによる表示)
%y ファイルのタイプ(「ls -l」の表現とほぼ同じ)
%Y ファイルのタイプ(%yと同じだがシンボリックリンクをたどる)
%n ファイルのハードリンク数
%i inode番号
%u ファイルの所有者名
%U ファイルのユーザーID番号
%g グループ名
%G グループID番号
%t ファイルの更新日時(%TD、%TRのように、%Aと書式を示すアルファベットでも指定可能)
%a ファイルの最終アクセス日時(%AD、%ARのように、%Aと書式を示すアルファベットでも指定可能)
%c ファイルの最終ステータス変更日時(%CD、%CRのように、%Cと書式を示すアルファベットでも指定可能)
%s ファイルサイズ(バイト数)
%b ファイルが消費しているディスクスペースのブロック数(通常は1ブロック512KB)
%k ファイルが消費しているディスクスペースのブロック数(1KBでのブロック数)
%d ディレクトリツリー中の深さ(「0」=コマンドライン引数の位置)
%D ファイルがどのデバイス上にあるか(10進数表示)
%F ファイルが置かれているファイルシステムのタイプ(「-fstype」で指定するものと同じ)

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

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

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

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

コマンド実行例

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


画面2 画面2 rmコマンドでホームディレクトリ下の空のファイルを確認しながら削除しているところ

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



筆者紹介

西村 めぐみ(にしむら めぐみ)

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


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。