find - ファイルを検索しファイルリストを出力する

find

findコマンドはファイルを検索して検索したファイルリストを出力するコマンドです。

追加で式(expression)を記述することで、検索するファイルを絞り込むことができます。

また、-exec等の式を用いることで検索したファイルを用いてコマンドを実行することもできます。とても応用が効くコマンドで是非、使い方を覚えておきたいコマンドです。

スポンサーリンク

findコマンドの構文

findコマンドの基本的な構文

fileは、findコマンドが検索の起点とするディレクトリツリーのファイル名(ディレクトリ名)です。

expressionは一つ以上の要素からなります。この要素はいくつか分類分けされて、以下の種類があります。

要素の種類

要素意味
Testファイルの属性によって、真偽を判定
Action何かの操作を行い、真偽を返す
Option常に真を返し、全体的な操作に影響を与えます
Operator2つの要素に対しての演算子(例:-andや-or)
2つの要素に対してOpreratorが省略された場合、デフォルトは-andになります

findコマンドの利用例

カレントディレクトリから下位階層のファイルを検索

findコマンドを用いて、検索するファイルにカレントディレクトリを表す.(ドット)を指定することで、カレントディレクトリより下位にあるディレクトリのファイルを検索できます。そして、結果としてその検索したファイルのファイルリストを出力することが出来ます。

また、findコマンドは検索するファイルが指定されていない場合、カレントディレクトリを表す.(ドット)が検索するファイルとして使用されます。
そして、findコマンドで式が指定されていない場合、-printが使用されます。

コマンド例

または

もちろん、ルートディレクトリを指定するとすべてのファイルを検索することが出来ます。ただし、検索するのにとても時間がかかるかもしれません。
コマンド例

findコマンドの式

findコマンドは、検索するファイルの後に式を記述することが出来ます。この式によって、検索条件を指定していき、より欲しいファイルリストを作成することが出来ます。
式は、1つ以上の要素で成り立ち、その要素はおおまかにOption,Test,Action,Operatorの4つになります。

この式は検索したファイルのそれぞれに適用されていきます。それぞれの要素が評価された場合、真偽を返していき、複数の要素は-a(and)や-o(or)等のOpreratorで繋げられていきます。
Opreratorが省略された場合は-aで繋げられます。

ただし、Optionの場合はファイルに適用された時点でfindコマンドの機能としてそのオプションがONになるため、できるだけ最初に記述するようにします。

この式に、-prune以外のActionが指定されていない場合、式が真であるファイルに対して、そのファイル名を表示するActionの-printが使用されます。
また、数字を引数にする要素については+nがnより大きい数、-nがnより小さい数、nがちょうどnの数を表します。

Optionの利用例

Optionは、findコマンドの全体的な動作に影響を与える要素になります。これは基本的に式の最初の方に記述します。Optionの種類には以下のようなものがあります。

Optionの種類

option意味
-daystart現在の日の24:00を基準
-regextype type正規表現の種類をtypeに変更(awk,grep等)
typeをhelpにするとリストを確認可能
-warnまたは-nowarnwarning messageの切り替え、デフォルトは
端末の標準入力時、-warn
それ以外、-nowarn
-depth (-d)ディレクトリの内容を処理した後でディレクトリ自身を処理
-helpfindの使い方のまとめを表示
-ignore_readdir_raceファイル名の読み込み時とファイル情報の確認時の間に
ファイルが削除されたときにエラーメッセージを表示しない
-noignore_readdir_race-ignore_readdir_raceをオフ
-maxdepth levels開始ファイルからlevelsまでの下の階層まで降りる
-maxdepth 0は開始ファイルのみをTestやActionを適用
-mindepth levels開始ファイルからlevelsまでの下の階層までTestやActionを適用しない
-mindepth 1は開始ファイル以外を適用
-xdev他のファイルシステムを検索しない
-mount-xdevの別名。他のファイルシステムを検索しない
-noleafUNIXディレクトリリンクの規約でないファイルシステムの検索に必要
(例:CD-ROM、MS-DOS等)
-versionfindのバージョン表示

検索ディレクトリの階層指定

検索ディレクトリの階層を指定するには、-maxdepthや-mindepthを用います。

-maxdepthは指定した数字までの階層までを検索します。例えば、
-maxdepthで0が指定されるとfindコマンドの開始点のファイル(ディレクトリ)のみを検索します。
-maxdepthで1が指定されると開始点のファイル(ディレクトリ)の中の内容も検索します。
-maxdepthで2が指定されると開始点のファイル(ディレクトリ)の中の内容と、さらにその中のディレクトリを一つ降りたファイル(ディレクトリ)までを検索します。

コマンド例でのカレントディレクトリからのディレクトリ構造

コマンド例と実行結果

-mindepthは指定した数字の階層までTestやActionの式を適用しません。例えば、
-mindepthが0の場合は特に影響はありません。
-mindepthが1の場合はfindコマンドの開始点のファイルにTestやActionの式を適用しません。
-mindepthが2の場合は開始点のファイル(ディレクトリ)とその中のファイル(ディレクトリ)までTestやActionの式を適用しません。

コマンド例と実行結果

時間の基準を変更

-daystartを用いると、-aminや-atime等の時間を条件にする式の時間の基準を変更でき、切りのいい時間を基準にすることができます。変更される時間は、現在時間から現在日の24:00(明日の0:00)になります。

例えば、現在日を2018/01/04とすると、-atimeで0日前に設定すると2018/01/05の00:00:00から2018/01/04の00:00:01までの範囲のファイルが条件に当てはまります。つまり、2018/01/05の00:00:00時点から0分前から1439分(1日-1分)までの時間が0日前に当てはまります。同様に1日前を設定すると2018/01/04の00:00:00~2018/01/03/00:00:01の範囲が条件に当てはまっていきます。

コマンド例と実行結果

statコマンドは、ファイルの情報やファイルシステムの情報を確認することができます。 lsコマンドよりも詳しいファイル...

Testの利用例

Testは、検索しているファイルの属性に対して、真偽を返す要素になります。findコマンドでファイルを検索するときに、このTestを用いていくことで検索条件を追加していくことが出来ます。Testの種類は以下のようなものがあります。

Testの種類

test意味
-name patternファイル名がpatternにマッチしたファイルなら真
-lname patternpatternにマッチしたシンボリックリンクファイルなら真
-iname patternpatternの大小の区別はしない。patternにマッチしたファイルなら真
-ilname patternpatternの大小の区別はしない。patternにマッチしたシンボリックリンクなら真
-path patternファイルパスがpatternにマッチしたなら真
-ipath patternpatternの大小の区別はしない。ファイルパスがpatternにマッチしたなら真
-wholename patern-pathと同様
-iwholename pattern-ipathと同様
-regex patternファイルパスが正規表現のpatternにマッチしたなら真
-iregex patternpatternの大小の区別はしない。ファイルパスが正規表現のpatternにマッチしたなら真
-amin nアクセス時間(atime)が現在からn分前なら真
-anewer fileファイルのアクセス時間(atime)がfileの修正時間(mtime)より最近なら真
-atime nアクセス時間(atime)が現在からn日前なら真
-cmin nステータス変更時間(ctime)が現在からn分前なら真
-cnewer fileファイルのステータス変更時間(ctime)がfileの修正時間(mtime)より最近なら真
-ctime nステータス変更時間(ctime)が現在からn日前なら真
-mmin n修正時間(mtime)がn分前なら真
-mtime n修正時間(mtime)がn日前なら真
-newer fileファイルがfileより修正時間(mtime)が最近ならなら真
-newerXY fileタイムスタンプの比較をより詳しく指定
-newerの文字の後にあるXとYも別の文字を置き換えて使用
(例:-neweram,-newermt)
ファイルのXのタイムスタンプがfileのYのタイムスタンプより最近なら真
-used nファイルのアクセス時間(atime)と変更時間(ctime)の差がn日なら真
使われていないファイルの検索等に利用
-size nファイルサイズがnなら真
単位がある場合、数値はその単位ごとに切り上げられる
(例:1Mの範囲は1〜1048576c,cはバイトを表す単位)
-type cファイルの種類がcなら真
(例:dはディレクトリ,fは通常ファイル)
-xtype cシンボリックリンクファイルのための-type
findに-H,-Pオプションがある時、シンボリックリンク先のファイルの種類がcなら真
findに-Lオプションがある時、シンボリックリンクファイルはcが'l'で真
-perm modeファイルの権限がmodeなら真
-readableファイルが読込可能なら真
-writableファイルが書込可能なら真
-executableファイルまたはディレクトリが実行(検索)できるなら真
-emptyファイルまたはディレクトリが空なら真
-user unameファイルの所有者がuname(所有者ID可)なら真
-uid nファイルの所有者ID(数字)がnなら真
-group gnameファイルのグループ(グループIDも)がgroupなら真
-gid nファイルのグループID(数字)がnなら真
-inum nファイルのinodeがnなら真
-samefile fileファイルのinodeがfileと同じなら真
-links nファイルのリンク数がnなら真
-nouser所有者が存在しない(所有者が削除された)ファイルなら真
-nogroupグループが存在しない(グループが削除された)ファイルなら真
-fstype typeファイルシステムがtypeなら真(例:ext4等)
-true常に真
-false常に偽
-context patternSELinuxのコンテキストがpatternなら真

-nameの利用例

-nameはパターンマッチしたファイル名のときに真になるTestの式です。パターンに用いることができるワイルドカードは以下のようになります。

使用できるワイルドカード

ワイルドカード意味
?任意の1文字
*任意の0文字以上の文字列
[]カッコ内の文字のどれか一文字

カレントディレクトリの内容

コマンド例と実行結果

-nameと-pathの違い

-nameはディレクトリ部分のパスを除いたファイル名の部分を用いて、検索します。例えば、'./file1.txt'を検索中ならば、-nameの式は'file1.txt'に対してパターンマッチを行います。

-pathは、そのままのファイルパスに対してパターンマッチします。また、findコマンドの開始点のファイルが相対パスならば、相対パスでパターンを記述し、絶対パスなら絶対パスで記述します。-pathの利用できるワイルドカードは-nameと同じになります。

-pathと同じようにそのままのファイルパスに対してパターンマッチする式に-regexがあります。こちらは正規表現を用いて、パターンマッチを行うことができます。例えば、.(ドット)は任意の一文字を表し、*(アスタリスク)は直前の文字が0文字以上の繰り返しになります。

パーミッションの条件指定

-permはファイルの権限を条件として真偽の判定をすることができます。-permで指定するファイルの権限は数字形式でもシンボリック形式のどちらでも指定することができます。-permは3つの指定の仕方があります。例えば、以下のようなファイルを例に出します。

一つは'-perm mode'の形式で、これはファイルの権限がちょうどmodeのときに真になります。

次は'-perm -mode'の形式で、これはmodeで指定した権限がすべてあるときに真になります。

最後は'-perm /mode'の形式で、これはmodeで指定した権限のいずれかがある場合に真になります。

ディレクトリを除くなどのファイル種類による条件指定

ファイルの種類を指定する式は-typeになります。-typeは記号でファイルの種類を指定して、検索しているファイルと指定したファイルの種類が当てはまっている場合に真になります。指定できるファイルの種類には以下のような種類があります。

指定できるファイルの種類

記号意味
f通常のファイル
dディレクトリ
lシンボリックリンクファイル
pパイプ
bブロック型スペシャルファイル(デバイスファイル)
c文字型スペシャルファイル(デバイスファイル)
sソケット

例えば、カレントディレクトリを起点として、ディレクトリ除いたファイルリストがほしい場合には、-typeとOperatorの否定を表す'!'を用いると、ディレクトリを除いたファイルリストを表示することができます。

コマンド例

カレントディレクトリの内容

実行結果

日時の条件指定

-atime等の日時を条件とする場合、n日前より以前やn日以内のような指定を行いたい場合があります。その場合は+n,-nのように記述します。+nはnより大きい数、-nはnより小さい数になります。そして、数字がnとして指定されている場合はちょうどnという数になります。

例えば、180日前より以前の場合は+180日、180日以内に-180のように指定することができます。

コマンド例と実行結果

Actionの利用例

Actionは、検索されているファイルに対して、何かの動作を行う要素になります。

Actionの種類

action意味
-deleteファイルを削除
-exec command ;findコマンドが実行されたディレクトリでcommandを実行
'{}'はfindコマンドが実行されたディレクトリからの相対パスとしてファイル名を展開
commandの終了ステータスが0なら真
-exec command {} +findコマンドが実行されたディレクトリでcommandを実行
{}はcommand内で一度だけ使用でき、-execでのファイル名のリストを展開
ただし、コマンドラインで利用できる最大長を超えないように展開
'{} +'はcommandの末尾に記述
-execdir command ;検索されたファイルのディレクトリでcommandを実行
'{}'はファイル名を展開
commandの終了ステータスが0なら真
-execdir command {} +検索されたファイルのディレクトリでcommandを実行
'{}'は一度だけ使用でき、-execdirでのファイル名のリストを展開
ただし、コマンドラインで利用できる最大長を超えないように展開
'{} +'はcommandの末尾に記述
-ok command ;ユーザにcommandを実行するかどうかを問う
commandの実行は-execと同様
-okdir command ;ユーザにcommandを実行するかどうかを問う
commandの実行は-execdirと同様
-lsls -dilsの形式でファイル情報を出力
-printファイル名を出力し、改行で区切る
-print0ファイル名を出力し、ヌル文字で区切る
-printf formatCの関数のprintfのようにformatを指定して、文字列を出力
-printのように最後に改行を追加しないことを留意
-fls filefileを作成し、-lsのような出力をそのfileに出力
-fprint filefileを作成し、-printのような出力をそのfileに出力
-fprint0 filefileを作成し、-print0のような出力をそのfileに出力
-fprintf file formatfileを作成し、-printfのような出力をそのfileに出力
-prune検索されるファイルがディレクトリの場合、そのディレクトリの中を検索しない
-quitfindコマンドの処理を終了

-execや-execdirの利用例

-execや-execdirは検索しているファイルに対してコマンドを実行することができます。また、構文の最後にある';'は、シェルとしての文字によって解釈されないようにエスケープする必要があります。

-execコマンドはfindコマンドを実行したディレクトリからコマンドを実行します。実行したいコマンドに対して、'{}'という文字列は検索しているファイル名を展開する文字列として使用することができます。また、ファイル名は、findコマンドの検索の起点ファイルが相対パスならば、findコマンドを実行したディレクトリからの相対パスになります。

コマンド例と実行結果(起点を相対パス)

コマンド例と実行結果(起点を絶対パス)

-execdirはfindコマンドによって検索されているファイルのディレクトリに移動し、コマンドを実行します。また、ファイル名はその移動した後のディレクトリからの相対パス、つまりファイル名のみで表されます。

コマンド例と実行結果(起点を相対パス)

コマンド例と実行結果(起点を絶対パス)

-execのパイプ処理など

$PATHよりコマンドを検索して、実行します。そのため、組み込みコマンドを利用することが出来ません。
例えば、変数を宣言するBash組み込みコマンドdeclareを用いると

declareというファイルが見つかりませんなどのエラーメッセージを出します。

そのため、パイプ処理などのシェルの機能を使う場合は'sh -c'を用いて、コマンドを実行させます。

コマンド例と実行結果

-exec {} +または-execdir {} +による末尾以外でのファイル名展開

-execや-execdirの式は、ファイルの数だけコマンドを実行します。rmコマンド等のようにコマンドによっては、'-exec {} +'や'-execdir {} +'の式でコマンドの末尾にファイルを列挙し、コマンドを実行して、コマンドの呼び出し回数を減らすことができます。

しかし、cpコマンド等のコマンドによっては、末尾にファイルを列挙することが不都合な場合があります。そのような場合はsh -cでコマンドを実行することでコマンドの末尾以外にファイルを列挙することができます。

コマンド例と実行結果

大量なファイルの削除

rmコマンドで大量なファイルを削除する時、削除するファイルが多すぎて、削除できない場合があります。

そのような大量のファイルを削除したい場合にfindコマンドの-deleteの式を用いて、ファイルを削除することができます。

コマンド例と実行結果

Operatorの利用例

Operatorは、式の中の2つの要素を繋げる演算子になります。このOperatorが省略されている場合は、-a(-and)が使用されます。

Operatorの種類

operator意味
( expr )式のグループ化
! expr否定
expr1 -a expr2AND、expr1が偽ならexpr2は評価されない
expr1 expr2-aと同じ
expr1 -o expr2OR、expr1が真ならexpr2は評価されない
expr1 , expr2リスト、expr1とexpr2は常に評価される
式の値はexpr2が使用される(expr1の値を捨てられる)

また優先順位は表の上にあるものが高く、下にあるものが低くなっています。

式のグループ化

式のグループ化は、括弧がシェルに解釈されないようにエスケープする必要があります。式のグループ化は、例えば、ORとANDが同時に存在する場合に利用することができます。

-oの演算子はexpr1の評価値が真のとき、その後に続く式が評価されません。また、AND演算子はOR演算子よりも優先順位が高いため、場合によっては意図した動作と異なる場合があります。

コマンド例と実行結果

参考

Finding Files

スポンサーリンク