wivern ロゴ

サイバーセキュリティ研究所

サイバーセキュリティを中心に、軍事、防犯、サーバーの管理と監視、その他、最新技術を研究しています。


Linux コマンド辞典「find」

find : ファイルを検索する

command: find

前回に引き続き、Linux のファイル検索系のコマンドとして、今回は find を man の内容から紹介します。
find の特徴としては、引数で与えられたパス以下のディレクトリしか検索しないという点です。


名前
find - ディレクトリ階層下のファイルを検索する。

書式
find [path...] [expression]

説明
このマニュアルページは GNU 版 find の使用法を記述したものである。
find は与えられたファイル名以下のディレクトリツリーを検索し、同じく与えられた評価式を左から右に向かって優先順位の高いものから評価する(演算子のセクションを見よ)。
評価式の結果が確定すると (and の左項が偽だったり、or の左項が真だった場合など)評価は終了し、引き続き次のファイル名が評価される。

「-」、「(」、「)」、「,」、 または「!」ではじまる最初の引き数は、評価式の始まりであるとみなされる。
その前の引き数は検索するパスとなる。
パスが与えられない場合はカレントディレクトリ以下を検索する。
評価式が与えられない場合は '-print' が評価式として用いられる。

find は全てのファイルの処理に成功するとステータス 0 を返して終了する。
エラーがあった場合には 0 以上の値を返す。

評価式
評価式はオプション、判別式、及びアクションからなる。
オプションは特定のファイルのみでなく全体の処理に影響し、常に真を返す。
判別式は真または偽の値を返す。
アクションは付加的な作用を持ち、真または偽を返す。
評価式のそれぞれの要素は演算子によって区切られている。
演算子が省略された場合は -and が指定されたものとされる。
-prune 以外のアクションが評価式に含まれていない場合は、評価式の結果が真となったファイルに対して -print が実行される。

オプション
全てのオプションは常に真を返す。
また全てのオプションは常に効力を持ち 、式の評価がオプションの位置に到達したときにのみ実行される訳ではない。
従って記述を明確にするためには、全てのオプションは評価式の先頭部にまとめて置くのが望ましい。

-daystart
-amin 、-atime、-cmin、-ctime、-mmin、-mtime の時間の基準を 24 時間前ではなく、コマンドを実行した日の 0 時にする。

-depth
ディレクトリ本体の前に、ディレクトリの内容を先に評価する。

-follow
シンボリックリンクの参照先を検索する。
-noleaf は自動的に指定されたことになる。

-help, --help
find のコマンドラインの使用方法の概要を表示して終了する。

-maxdepth levels
コマンドライン引き数から降りて検索するディレクトリレベルの最大値を指定する(levels は非負の整数)。
'-maxdepth 0' はコマンドライン引き数のみを評価し、アクションの対象にすることを意味する。

-mindepth levels
levels (非負整数) 未満のレベルのディレクトリには評価やアクションを行わない。
'-mindepth 1' とすると、コマンドライン引き数で指定したファイルを除き、全てのファイルを処理する。

-mount
他のファイルシステムにあるディレクトリを探索しない。
-xdev の別名であり、他の版の find との互換性のために用意された。

-noleaf
「ディレクトリのハードリンク数から 2 を引いたものが、そのディ レクトリに含まれるサブディレクトリである」とする最適化動作を行わない。
このオプションは Unix のディレクトリリンク方式に従わないファイルシステムを検索するときに必要となる(例えば CD-ROM や MS-DOS ファイルシステム、 AFS ボリュームなど)。
通常の Unix ファイルシステムでは、それぞれのディレクトリは最低二つのハードリンクを持っている(ディレクトリ名のエントリと '.' エントリ)。
またサブディレクトリがある場合には、それぞれのサブディレクトリ内にさらに '..' と言うエントリができる。
find がディレクトリを調べる際、そのディレクトリのハードリンクの数よりも 2 少ないエントリがサブディレクトリであることが判明したら、残りのエントリはディレクトリではないものとされる(ディレクトリツリーの 'leaf(葉)' であるとみなされる)。
もしファイル名だけが必要な場合には、そのファイルの内容は評価されない。
この最適化を用いると、検索の速度が非常に向上する。

-version, --version
find のバージョンを表示して終了する。

-xdev
他のファイルシステムにあるディレクトリは探索しない。

判別式
数値の引き数を
 +n と表わすと n より大きいことを示し、
 -n と表わすと n より小さいことを示す。
 n はちょうど n と等しいことを示す。

-amin n
ファイルが最後にアクセスされたのが n 分前であれば真。

-anewer file
file が修正された以降にアクセスされたファイルに対して真を返す。
-follow がコマンドライン上で -anewer より前に指定されている場合に限り、-anewer は -follow による影響を受ける。

-atime n
ファイルが最後にアクセスされたのが n*24 時間前であれば真。

-cmin n
ファイルのステータスが最後に変更されたのが n 分前であれば真。

-cnewer file
file が修正された以降にファイルステータスが変更されたファイルに対して真を返す。
-follow がコマンドライン上で -cnewer より前に指定されている場合に限り、-cnewer は -follow による影響を受ける。

-ctime n
ファイルのステータスが最後に変更されたのが n*24 時間前であれば真。

-empty
ファイルが空で、通常のファイルかディレクトリならば真。

-false
つねに偽。

-fstype type
ファイルが置かれているファイルシステムが type ならば真。
用いることのできるファイルシステムは Unix のバージョンによって異なる。
ある バ ージョンの Unix では ufs や 4.2, 4.3, nfs, tmp, mfs, S51K, S52K といったようなものが指定可能である。
-printf を %F 書式指定子と共に用いれば、どのようなファイルシステムを使っているかがわかる。

-gid n
ファイルのグループ ID 番号が n ならば真。

-group gname
ファイルの属するグループが gname ならば真(ID 番号も指定可)。

-ilname pattern
-lname と同じだが、大文字小文字を区別しない。

-iname pattern
-name と同じだが、大文字小文字を区別しない。
例えばパターン 'fo*' も 'F??' も 'Foo', 'FOO', 'foo', 'fOo' などにマッチする。

-inum n
ファイルの i-ノード番号が n ならば真。

-ipath pattern
-path と同じだが、大文字小文字を区別しない。

-iregex pattern
-regex と同じだが、大文字小文字を区別しない。

-links n
ファイルのリンク数が n ならば真。

-lname pattern
ファイルがシンボリックリンクであり、そのリンク先がシェルのパターン pattern にマッチすれば真。
メタキャラクタは '/' や '.' を例外扱いしない。

-mmin n
ファイルのデータが最後に修正されたのが n 分前なら真。

-mtime n
ファイルのデータが最後に修正されたのが n*24 時間前なら真。

-name pattern
ディレクトリの部分を取り去ったファイル名がシェルのパターン pattern にマッチすれば真。
メタキャラクタ ('*'、'?' および '[]') は 、ファイル名の先頭の '.' にはマッチしない。
あるディレクトリおよびそれ以下のファイルを無視するには -prune を用いる。
-path の説明にある例を参照のこと。

-newer file
ファイル file 以降に修正されたファイルに対して真を返す。
-follow がコマンドライン上で -newer より前に指定されている場合に限り、-newer は -follow による影響を受ける。

-nouser
ファイルのユーザー ID 番号に対応するユーザーがいなければ真。

-nogroup
ファイルのグループ ID 番号に対応するグループがなければ真。

-path pattern
ファイル名がシェルのパターン pattern にマッチすれば真。
メタキャラクタは '/' や '.' を例外扱いしない。
従って例えば
 find . -path './sr*sc'
は './src/misc' というディレクトリを(実際に存在していれば)表示する。
ディレクトリツリー全体を無視するためには、一つ一つのファイルをチェックするより -prune を用いる方が良い。
たとえば 'src/emacs' ディレクトリおよびそれ以下のファイルをすべて無視し、他のファイルを表示したいような場合には、以下のようにする。
 find . -path './src/emacs' -prune -o -print

-perm mode
ファイルの許可属性が mode (8 進または文字による指定) とまったく同じであったら真。
文字の場合は許可属性 0 からの差分を指定しているものとみなされる。

-perm -mode
mode で指定されている許可属性ビットのすべてがファイルでも立っていたら真。

-perm +mode
mode で指定されている許可属性ビットがファイルでどれか一つでも立っていたら真。

-regex pattern
ファイル名が正規表現 pattern にマッチすれば真。
このマッチは(すべてのパスを含む)ファイル名全体に対してでなければならない。
例えば './fubar3' というファイルにマッチさせるには、正規表現 '.*bar.' や '.*b.*3' が使えるが、'b.*r3' はマッチしない。

-size n[bckw]
ファイルが n 分の領域を使用していたら真。
デフォルトでは n の単位は 512 バイトのブロックとなる( n の後に 'b' が続いた場合も同様)。
後に続く文字が 'c' ならば単位はバイト、'k' ならばキロバイト、'w' ならば 2 バイトのワード。
サイズには間接ブロック( indirectblock )の分は含まれない。
しかし穴空きファイル( sparse file )における、実際には割り当てられていないブロックの分は含まれる。

-true
常に真。

-type c
c で表されるタイプのファイルならば真。
c としては以下がある:

 b ブロックスペシャルファイル (バッファ付き)
 c キャラクタスペシャルファイル (バッファ無し)
 d ディレクトリ
 p 名前付きパイプ (FIFO)
 f 通常のファイル
 l シンボリックリンク
 s ソケット

-uid n
ファイル所有者のユーザー ID の数値が n ならば真。

-used n
ファイルが最後にアクセスされたときと、属性が最後に変更されたときの差が n 日であれば真。

-user uname
ファイルの所有者がユーザー uname ならば真 (ID の数値も指定可能)。

-xtype c
ファイルがシンボリックリンク以外の場合は -type と同じ。
シンボリックリンクに対しては以下のように判断される。
この判別式の前に -follow が指定されていなかった場合は、リンク先のファイルのタイプが c ならば真。
-follow が指定されていた場合は c が 'l' ならば真。
つまりシンボリックリンクに対して、-xtype は -type がチェックしない側をチェックする。

アクション
-exec command ;
command を実行する。
コマンドの戻り値が 0 ならば真。
find のコマンドラインで指定されたこれ以降の引き数は、';' を含む引き数にいたるまで、すべて command の引き数とみなされる。
文字列 '{}' は現在処理しているファイル名に置き換えられる。
これは command 引き数のどこにあってもよく、単独で置かれていなくてもよい(単独で置かれていなければならないような find もある)。
これらの文字はシェルによって展開されないよう、'\' によってエスケープするか引用符で囲む必要がある。
コマンドは find を実行したディレクトリから実行される。

-fls file
真を返す。-ls と同じ出力を -fprint のように file に出力する。

-fprint file
真を返す。
フルパスのファイル名をファイル file に出力する。
find の実行時に file が存在しない場合は新たに作成される。
すでに存在する場合は元の中身は捨てられる。
''/dev/stdout'' および ''/dev/stderr'' というファイル名は特別に扱われ、それぞれ標準出力と標準エラー出力に結果が渡される。

-fprint0 file
真を返す。
-print0 と同じ出力を -fprint のように file に出力する。

-fprintf file format
真を返す。
-printf と同じ出力を -fprint のように file に出力する。

-ok command ;
-exec と似ているがまずユーザーに問い合わせを行い、標準入力から回答を受け取る。
結果が 'y' または 'Y' で始まらない場合はコマンド実行は行なわず、偽を返す。

-print
真を返す。
ファイル名をフルパスで標準出力に表示し、各ファイル名に改行文字を付加する。

-print0
真を返す。
ファイル名をフルパスで標準出力に表示し、各ファイル名にヌル文字を付加する。
このオプションを用いれば、 find の出力を処理するプログラムにおいて改行文字を含んだファイル名を正しく解釈できるようになる。

-printf format
真を返す。
format を標準出力に表示する。
'\' はエスケープ文字、'%' は書式指定文字として解釈される。
フィールドの幅と精度は C 言語の 'printf' 関数のように指定できる。
-print と異なり、 -printf は文字列の最後に改行文字を付加しない。
エスケープ文字と書式指定子は以下の通り:

 \a ビジブルベル。
 \b バックスペース。
 \c このフォーマットのプリントをただちに停止し、出力バッファをフラッシュする。
 \f フォームフィード文字。
 \n 改行文字。
 \r 復帰文字。
 \t 水平タブ。
 \v 垂直タブ。
 \\ バックスラッシュ文字 ('\')。

文字 '\' に '\' 以外の文字が続いた場合は通常のキャラクタとして扱われる。
従って 2 文字とも表示される。

 %%  パーセント文字。
 %a  ファイルが最後にアクセスされた時間。
    C の 'ctime' 関数の戻り値と同じフォーマットが用いられる。
 %Ak ファイルが最後にアクセスされた時間。
    フォーマットは k で指定されたものが用いられる。
    k には '@' か、あるいは C の 'strftime' 関数の書式指定子を用いることができる。
    指定可能な値を以下にリストする。
    一部のものは使えないシステムがあるかもしれない。
    これはシステム間での 'strftime' の非互換性による。

    @ Jan. 1, 1970, 00:00 GMT からの経過秒数。

     時刻フィールド:
     H 時間(00..23)
     I 時間(01..12)
     k 時間( 0..23)
     l 時間( 1..12)
     M 分(00..59)
     p 現在のロケールにおける AM または PM
     r 時間(12 時間表示) (hh:mm:ss [AP]M)
     S 秒(00..61)
     T 時間(24 時間表示) (hh:mm:ss)
     X 現在のロケールによる時刻表示(H:M:S)
     Z タイムゾーン(JST など)。タイムゾーンを決定できない場合はなにも返さない。

     日付フィールド:
     a 現在のロケールによる曜日名の短縮形(Sun..Sat)
     A 現在のロケールによる曜日名のフル表示。長さは可変(Sunday..Saturday)
     b 現在のロケールによる月名の短縮形(Jan..Dec)
     B 現在のロケールによる月名のフル表示。長さは可変(January..December)
     c 現在のロケールによる日付と時刻表示 (Sat Nov 04 12:02:33 EST 1989)
     d その月何日目かの表示 (01..31)
     D 日付(mm/dd/yy)
     h b と同じ
     j その年何日目かの表示(001..366)
     m 月(01..12)
     U その年の何週目か(日曜日を週の始まりとする) (00..53)
     w 曜日(0..6)
     W その年の何週目か(月曜日を週の始まりとする) (00..53)
     x 現在のロケールによる日付表示(mm/dd/yy)
     y 年の最後の2桁分(00..99)
     Y 年(1970...)

 %b  ファイルサイズを 512 バイト単位で表した数値(切り上げ表示)。
 %c  ファイルのステータスが最後に変更された時間。
    C の 'ctime' 関数の戻り値と同じフォーマットが用いられる。
 %Ck  ファイルのステータスが最後に変更された時間。
    フォーマットには k で指定されたものが用いられる。
    k の書式は %A と同じ。
 %d  ディレクトリツリー中のファイルの深さ。
    0 ならばファイルはコマンドライン引き数であることになる。
 %f  ファイル名を前にあるディレクトリをすべて削除して表示したもの(つまり最後の要素のみ)。
 %F  ファイルが置かれているファイルシステムのタイプ。
    ここで表示された値は -fstype に指定することができる。
 %g  ファイルのグループ名。名前が指定されていない場合はグループ ID 番号。
 %G  ファイルのグループ ID 番号。
 %h  フルパスから最後のファイル名を除いたディレクトリ部。
 %H  ファイルが属しているコマンドライン引き数。
 %i  ファイルの i-ノード番号 (10 進表示)。
 %k  ファイルのサイズを 1K ブロック単位で示した数値 (切り上げ表示)。
 %l  シンボリックリンクの参照先(シンボリックリンクでない場合は空文字)。
 %m  ファイルの許可属性ビット( 8 進表示)。
 %n  ファイルへのハードリンクの数。
 %p  ファイル名。
 %P  ファイル名を印字する。
    ただしコマンドライン引き数で指定された部分は表示されない。
 %s  ファイルのサイズ (バイト単位)。
 %t  ファイルが最後に修正された時間を C の 'ctime' 関数形式 で表現したもの。
 %Tk  ファイルが最後に修正された時間を k で指定されたフォーマットで現したもの。
    指定形式は %A と同じ。
 %u  ファイルのユーザー名。対応する名前が無い場合はユーザー ID の数値。
 %U  ファイルのユーザー ID の数値。

今までリストした以外の文字が '%' に続いた場合は無効。
ただし '%' の後に付いた文字は印字される。

-prune
同時に -depth が指定されていない場合は常に真。
ディレクトリを降りない。
-depth が指定されている場合は偽を返し、何もしない。

-ls
真を返す。
現在のファイルを 'ls -dils' 形式で標準出力にリストする。
ブロックカウントは 1K 単位で行われる。
ただし環境変数 POSIXLY_CORRECT が設定されている場合は、512 バイト単位のブロックが用いられる。

演算子
優先順位の順にリストしてある。

( expr )
かっこの内部が先に評価される。

! expr
expr が偽の場合真となる。

-not expr
! expr と同じ。

expr1 expr2
expr1 が偽の場合は expr2 は評価されない。

expr1 -a expr2
expr1 expr2 と同じ。

expr1 -and expr2
expr1 expr2 と同じ。

expr1 -o expr2
expr1 が真の場合には expr2 は評価されない。

expr1 -or expr2
expr1 -o expr2 と同じ。

expr1 , expr2
常に expr1 と expr2 の両方が評価される。
expr1 の値は捨てられ、全体の値は expr2 と等しくなる。

記述に際しては、細心の注意をしたつもりですが、間違いやご指摘がありましたら、こちらからお知らせいただけると幸いです。


→「Linux コマンド辞典「locate」」
←「Linux コマンド辞典「which」」


« 戻る