find - ディレクトリ階層でファイルを検索します
概要
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [開始点...] [式]
説明
このマニュアルページでは、GNU バージョンの find について説明します。GNU find は、指定された各開始点から始まるディレクトリツリーを検索し、与えられた式を左から右に、優先順位のルール (「演算子」のセクションを参照) に従って評価します。左側のオペランドが false (and 演算の場合) または true (or 演算の場合) になるまで、ファイル名ごとに評価を続けます。その時点で find は次のファイル名に移ります。開始点が指定されていない場合は、. が使用されます。
セキュリティが重要な環境 (たとえば、他のユーザーが書き込み可能なディレクトリを検索する場合) で find を使用する場合は、「findutils」ドキュメントの「セキュリティに関する考慮事項」の章 (「ファイルの検索」と呼ばれる) を読む必要があります。このドキュメントには、このマニュアルページよりもさらに詳細な情報と議論が含まれているため、より有用な情報源となる場合があります。
オプション
-H、-L、および -P のオプションは、シンボリックリンクの処理方法を制御します。コマンドライン引数は、最初の引数が -、(、または ! で始まるまで、検査するファイルまたはディレクトリの名前であると解釈されます。その引数とそれに続く引数はすべて、検索する内容を記述する式です。パスが指定されていない場合、現在のディレクトリが使用されます。式が指定されていない場合、-print 式が使用されます (ただし、-print0 を使用することを検討する方が良いでしょう)。
このマニュアルページでは、式リスト内の「オプション」について説明します。これらのオプションは find の動作を制御しますが、最後のパス名の直後に指定されます。実際の 5 つのオプション -H、-L、-P、-D、および -O は、存在する場合は、最初のパス名の前に表示する必要があります。二重ダッシュ -- を使用して、残りの引数がオプションではないことを示すこともできますが、find が次のパス引数の終わりをどのように判断するか (つまり、- で始まる引数を読み取るまで) のため、これは実際には機能しません。パス引数が - で始まる場合、find はそれを式引数として扱います。したがって、すべての開始点を正しく解釈し、特にシェルによって展開されたワイルドカードパターンが誤って式引数として扱われないようにするには、ワイルドカードまたは疑わしいパス名を ./ で始まるようにするか、/ で始まる絶対パス名を使用するのが一般的です。あるいは、GNU オプション -files0-from を使用して、任意の開始点を find に渡すことも一般的には安全ですが、移植性はありません。
-P シンボリックリンクをたどらない。これはデフォルトの動作である。findがファイルについて調べたり情報を出力したりする場合、ファイルがシンボリックリンクである場合、使用される情報はシンボリックリンク自体のプロパティから取得される。
-L シンボリックリンクをたどる。findがファイルについて調べたり情報を出力したりする場合、使用される情報は、リンクが指すファイルのプロパティから取得される。リンク自体からは取得されない(ただし、壊れたシンボリックリンクであるか、findがリンク先のファイルを調べられない場合は除く)。このオプションを使用すると、-noleaf が暗黙的に有効になる。後で -P オプションを使用しても、-noleaf は有効なままになる。-L が有効な状態で、find が検索中にサブディレクトリへのシンボリックリンクを発見した場合、シンボリックリンクが指すサブディレクトリが検索される。
-H シンボリックリンクをたどらない。ただし、コマンドライン引数を処理するときは除く。findがファイルについて調べたり情報を出力したりする場合、使用される情報はシンボリックリンク自体のプロパティから取得される。唯一の例外は、コマンドラインで指定されたファイルがシンボリックリンクであり、そのリンクを解決できる場合である。その場合、使用される情報はリンク先から取得される(つまり、リンクがたどられる)。リンク自体の情報は、リンク先のファイルが調べられない場合にフォールバックとして使用される。-H が有効な状態で、コマンドラインで指定されたパスの1つがディレクトリへのシンボリックリンクの場合、そのディレクトリの内容が調べられる(ただし、-maxdepth 0 を使用すると、これは防止される)。
-H、-L、-P のいずれかを複数指定した場合、それらは互いに上書きされ、コマンドラインで最後に指定されたものが有効になる。-P オプションはデフォルトであるため、-H または -L が指定されなかった場合は、-P が有効であると見なすことができる。
GNU find は、コマンドラインの処理中に、検索を開始する前に、頻繁にファイルを統計的に処理する。これらのオプションは、それらの引数の処理にも影響を与える。具体的には、コマンドラインにリストされているファイルと、現在調べているファイルを比較する多数のテストがある。各場合において、コマンドラインで指定されたファイルは調べられ、そのプロパティの一部が保存されている。指定されたファイルが実際にシンボリックリンクであり、-P オプションが有効な場合(または -H または -L のいずれも指定されていない場合)、比較に使用される情報は、シンボリックリンク自体のプロパティから取得される。それ以外の場合は、リンク先のファイルのプロパティから取得される。find がリンクをたどれない場合(たとえば、十分な権限がないか、リンクが存在しないファイルを参照している場合)、リンク自体のプロパティが使用される。
-H または -L オプションが有効になっている場合、-newer の引数としてリストされたシンボリックリンクは参照解決され、タイムスタンプはシンボリックリンクが指すファイルから取得されます。 -newerXY、-anewer、-cnewer にも同様の考慮事項が適用されます。
-follow オプションは -L と同様の効果がありますが、適用されるタイミングが異なります(つまり、-L が使用されていないが -follow が使用されている場合、-follow の後にコマンドラインに表示されるシンボリックリンクは参照解決され、それより前のシンボリックリンクは参照解決されません)。
-D debugopts 診断情報を出力します。これは、find が期待どおりに動作しない理由を診断するのに役立ちます。デバッグオプションのリストはカンマで区切る必要があります。findutils のリリース間でデバッグオプションの互換性が保証されるわけではありません。有効なデバッグオプションの完全なリストについては、find -D help の出力を参照してください。 有効なデバッグオプションには、以下が含まれます。
exec -exec、-execdir、-ok、-okdir に関連する診断情報を表示します。
opt 式ツリーの最適化に関する診断情報を出力します。-O オプションを参照してください。
rates 各述語が成功または失敗した頻度を示す概要を出力します。
search ディレクトリツリーを詳細に検索します。
stat stat および lstat システムコールでファイルが検査されるときにメッセージを出力します。find プログラムは、このような呼び出しを最小限に抑えるようにします。
tree 式ツリーを元の形式と最適化された形式で表示します。
all 他のすべてのデバッグオプションを有効にします(ただし、help は除きます)。
help デバッグオプションを説明します。
-Olevel クエリの最適化を有効にします。find プログラムは、実行速度を上げるためにテストの順序を再配置しますが、全体的な効果は維持します。つまり、副作用のある述語は互いに相対的な順序が変更されません。各最適化レベルで実行される最適化は次のとおりです。
0 0 は最適化レベル 1 と同じです。
1 これはデフォルトの最適化レベルであり、従来の動作に対応します。式の順序が再配置され、ファイル名のみに基づいてテスト(たとえば、-name および -regex)が最初に実行されます。
2 -type または -xtype テストは、ファイル名のみに基づいてテストされた後、inode からの情報が必要なテストの前に実行されます。多くの最新バージョンの Unix では、ファイルタイプは readdir() によって返されるため、これらの述語は最初にファイルを stat する必要のある述語よりも評価が高速になります。-fstype FOO 述語を使用し、find の開始時にファイルシステムタイプ FOO が `/etc/mtab` に存在しない場合、その述語は -false と同等になります。
3 この最適化レベルでは、完全なコストベースのクエリ最適化機能が有効になります。
テストの順序が変更され、高速なテストが最初に行われ、必要に応じてよりコストのかかるテストが後で行われます。 各コストバンド内では、述語が成功する可能性が高いか低いかに応じて、最初または後に行われます。 -oの場合、成功する可能性が高い述語が最初に行われ、-aの場合、失敗する可能性が高い述語が最初に行われます。
コストベースの最適化機能は、特定のテストが成功する可能性について、固定された考えを持っています。 場合によっては、テストの具体的な性質を考慮して確率が計算されます(たとえば、-type fは-type cよりも成功する可能性が高いと想定されます)。 コストベースの最適化機能は現在評価中です。 実際にfindのパフォーマンスを向上させない場合は、再度削除されます。 逆に、信頼性が高く、堅牢で、効果的な最適化は、時間の経過とともに、より低い最適化レベルで有効になる可能性があります。 ただし、デフォルトの動作(つまり、最適化レベル1)は、4.3.xリリースシリーズでは変更されません。 findutilsテストスイートは、findのすべてのテストを各最適化レベルで実行し、結果が同じであることを確認します。
コストベースの最適化機能によって実行される操作の順序の変更により、ユーザーが認識できる動作の変化が生じる可能性があります。 たとえば、-readableおよび-empty述語は順序変更の影響を受けます。 -empty -readableの順序で実行すると、読み取り不可能なディレクトリに対してエラーメッセージが出力されます。 -readable -emptyの順序で実行すると、エラーメッセージは出力されません。 このため、このような操作順序の変更は、デフォルトの最適化レベルでは実行されません。
式
コマンドラインの開始ポイントのリストの後の部分は式です。 これは、ファイルに一致する方法と、一致したファイルに対して何を行うかを記述するクエリ仕様の一種です。 式は、一連の要素で構成されます。
テスト テストは、通常、考慮しているファイルのあるプロパティに基づいて、真または偽の値を返します。 たとえば、-emptyテストは、現在のファイルが空の場合にのみ真を返します。
アクション アクションは副作用を持ちます(たとえば、標準出力に何かを出力するなど)。通常、それらが成功したかどうかに基づいて、真または偽を返します。 たとえば、-printアクションは、現在のファイルの名前を標準出力に出力します。
グローバルオプション グローバルオプションは、コマンドラインの任意の場所で指定されたテストとアクションの動作に影響を与えます。 グローバルオプションは常に真を返します。 たとえば、-depthオプションは、findがファイルシステムを深さ優先順でトラバースするようにします。
位置オプション 位置オプションは、その後に続くテストまたはアクションにのみ影響を与えます。 位置オプションは常に真を返します。 たとえば、-regextypeオプションは位置オプションであり、コマンドラインの後半で発生する正規表現の正規表現の方言を指定します。
演算子 演算子は、式内の他の項目を結合します。たとえば、-o(論理 OR を意味する)や -a(論理 AND を意味する)などです。演算子が省略された場合は、-a が想定されます。
-print アクションは、式全体が true であるすべてのファイルに対して実行されます。ただし、-prune または -quit 以外の別の処理が含まれている場合は例外です。-delete、-exec、-execdir、-ok、-okdir、-fls、-fprint、-fprintf、-ls、-print、-printf は、デフォルトの -print を抑制する処理です。
-delete アクションは、オプションとしても機能します(-depth を暗示するため)。
位置オプション
位置オプションは常に true を返します。これらは、コマンドラインの後半で発生するテストにのみ影響します。
-daystart -amin、-atime、-cmin、-ctime、-mmin、および -mtime の時間を測定する際に、今日0時からではなく、24時間前からの時間を基準にします。このオプションは、コマンドラインの後半に表示されるテストにのみ影響します。
-follow
非推奨。代わりに -L オプションを使用してください。シンボリックリンクをたどります。-noleaf を暗示します。-follow オプションは、コマンドラインの後半に表示されるテストにのみ影響します。-H または -L オプションが指定されていない場合、-follow オプションの位置は、-newer 述語の動作を変更します。-newer の引数としてリストされているファイルは、シンボリックリンクである場合、それらが参照するリンクがたどられます。-newerXY、-anewer、および -cnewer にも同様の考慮事項が適用されます。同様に、-type 述語は、常にシンボリックリンク自体ではなく、シンボリックリンクが指すファイルのタイプと一致します。-follow を使用すると、-lname および -ilname 述語は常に false を返します。
-regextype type
-regex および -iregex テストで使用される正規表現の構文を変更します。これは、コマンドラインの後半に表示されるテストに影響します。使用可能な正規表現のタイプを確認するには、-regextype help を使用します。Texinfo ドキュメント(「参照」を参照)には、さまざまなタイプの正規表現の意味と違いが説明されています。このオプションを使用しない場合、find は、正規表現のタイプとして emacs が指定されたかのように動作します。
-warn、-nowarn
警告メッセージをオンまたはオフにします。これらの警告は、コマンドラインの使用にのみ適用され、find がディレクトリを検索するときに遭遇する可能性のある条件には適用されません。デフォルトの動作は、標準入力が tty の場合は -warn、それ以外の場合は -nowarn に相当します。コマンドラインの使用に関する警告メッセージが出力された場合、find の終了ステータスは影響を受けません。POSIXLY_CORRECT 環境変数が設定され、-warn も使用されている場合、どの警告が有効になるかは指定されません。
グローバルオプション
グローバルオプションは常に true を返します。グローバルオプションは、コマンドラインの以前のテストにも影響を与えます。混乱を避けるため、グローバルオプションは、開始点のリストの後、最初のテスト、位置オプション、またはアクションの直前に、コマンドラインで指定する必要があります。グローバルオプションを他の場所で指定した場合、find は、それが混乱を招く可能性があることを説明する警告メッセージを発行します。
グローバルオプションは、開始点のリストの後に記述されるため、-L などのオプションとは異なります。
-d FreeBSD、NetBSD、MacOS X、および OpenBSD との互換性のために、`-depth` の別名です。
-depth 各ディレクトリの内容を、ディレクトリ自体よりも前に処理します。`-delete` アクションも `-depth` を暗黙的に意味します。
-files0-from file
コマンドラインではなく、ファイルから開始点を読み取ります。コマンドラインで開始点を渡すことには、ファイル名の数に制限があること、およびファイル名がオプション名と競合する可能性があるという既知の制限があります。このオプションを使用すると、find に渡す開始点の数を任意に増やすことができます。
このオプションとコマンドラインで開始点を渡すことは相互に排他的であり、同時に行うことはできません。
ファイル引数は必須です。-files0-from - を使用して、標準入力ストリームから開始点のリストを読み取り、たとえばパイプから読み込むことができます。この場合、-ok および -okdir アクションは許可されていません。これらは、ユーザーの確認を得るために標準入力から読み取る処理と明らかに干渉するためです。
ファイル内の開始点は、ASCII NUL 文字で区切られている必要があります。2 つの連続する NUL 文字、つまりゼロ長のファイル名を持つ開始点は許可されておらず、エラーメッセージが表示された後、ゼロ以外の終了コードで終了します。
指定されたファイルが空の場合、find は開始点を処理せず、プログラムの引数の解析後に直ちに終了します。これは、標準の呼び出し方法とは異なり、パス引数が渡されない場合、find は現在のディレクトリを開始点として仮定します。
開始点の処理は、通常どおり行われます。たとえば、find は、他の方法で防止されない限り、サブディレクトリを再帰的に検索します。開始点のみを処理するには、-maxdepth 0 を追加で渡すことができます。
補足:入力ファイルに同じファイルが複数回リストされている場合、そのファイルが複数回アクセスされるかどうかは未定義です。find の実行中にファイルが変更された場合、その結果も未定義です。最後に、find が終了したとき(-quit を使用する場合やその他の方法で終了した場合)に、指定されたファイル内のシーク位置も未定義です。ここで「未定義」とは、それが機能する場合もあれば、全く機能しない場合もあり、また、動作がプラットフォームや findutils のリリース間で変更される可能性があることを意味します。
-help, --help
^ ind のコマンドラインの使用方法の概要を表示して終了します。
-ignore_readdir_race
通常、find はファイルのステータス取得に失敗した場合にエラーメッセージを表示します。このオプションを指定し、ファイルがディレクトリからファイル名を読み取ったときと、そのファイルのステータス取得を試みる時間の間に削除された場合、エラーメッセージは表示されません。これは、コマンドラインで指定されたファイルまたはディレクトリにも適用されます。このオプションは、コマンドラインが読み取られるときに有効になるため、ファイルシステムの一部をこのオプションを有効にして検索し、残りの部分をこのオプションを無効にして検索することはできません(そうする必要がある場合は、代わりにオプションを有効にした find コマンドと、オプションを無効にした find コマンドの 2 つを発行する必要があります)。
さらに、-ignore_readdir_race オプションを指定して find を実行すると、親ディレクトリが読み込まれてからファイルが消失した場合の -delete アクションのエラーが無視されます。エラー診断が出力されず、-delete アクションの戻り値は true になります。
`-maxdepth レベル`
指定された開始点から、最大で レベル(非負の整数)個のディレクトリレベル以下まで検索します。-maxdepth 0 を使用すると、テストとアクションは開始点自体にのみ適用されます。
`-mindepth レベル`
^ ベル(非負の整数)未満のレベルでは、テストまたはアクションを適用しません。-mindepth 1 を使用すると、開始点を除くすべてのファイルを処理します。
`-mount`
別のファイルシステム上のディレクトリには移動しません。これは -xdev の別名であり、他のバージョンの find との互換性のために使用されます。
`-noignore_readdir_race`
^ ignore_readdir_race の効果を無効にします。
`-noleaf`
ディレクトリに 2 つ少ないサブディレクトリが含まれていると仮定する最適化を無効にします。このオプションは、Unix ディレクトリリンク規則に従わないファイルシステム(CD-ROM、MS-DOS ファイルシステム、または AFS ボリュームマウントポイントなど)を検索する場合に必要です。通常の Unix ファイルシステム上の各ディレクトリには、少なくとも 2 つのハードリンクがあります。つまり、その名前と . エントリです。さらに、そのサブディレクトリ(存在する場合)はそれぞれ、そのディレクトリにリンクされている .. エントリを持ちます。find がディレクトリを調べているとき、ディレクトリのリンクカウントよりも 2 つ少ないサブディレクトリを stat した後、残りのディレクトリエントリが非ディレクトリ(ディレクトリツリー内の「リーフ」ファイル)であることがわかります。ファイルの名前のみを調べる必要がある場合、それらを stat する必要はありません。これにより、検索速度が大幅に向上します。
`-version、--version`
^ ind のバージョン番号を出力して終了します。
`-xdev`
別のファイルシステム上のディレクトリには移動しません。
テスト
`-newerXY` や `-samefile` などのテストでは、現在調べているファイルとコマンドラインで指定された参照ファイルを比較できます。これらのテストを使用する場合、参照ファイルの解釈は、`-H`、`-L`、`-P` のオプションと、以前の `-follow` オプションによって決定されますが、参照ファイルはコマンドラインが解析されたときに 1 回だけ調べられます。参照ファイルを調べることができない場合(たとえば、`[stat]({filename}../../stat)(2)` システムコールが失敗した場合)、エラーメッセージが表示され、`find` は 0 以外のステータスで終了します。
テスト(-amin、-mtime、-gid、-inum、-links、-size、-uid、-usedなど)に数値引数nを指定できます。
+n は n より大きい場合、
-n は n より小さい場合、
n は n と完全に一致する場合です。
サポートされているテスト:
-amin n
ファイルは n 分以内に、または n 分より前に、またはちょうど n 分前に最終アクセスされました。
-anewer reference
現在のファイルの最終アクセス時間が、参照ファイルの最終データ変更時間よりも新しい。reference がシンボリックリンクであり、-H オプションまたは -L オプションが有効になっている場合、常に参照先のファイルの最終データ変更時間が使用されます。
-atime n
ファイルは n\*24 時間以内に、または n\*24 時間より前に、またはちょうど n\*24 時間前に最終アクセスされました。find がファイルの最終アクセス時間が何日前にあったかを計算する場合、小数部分は切り捨てられるため、-atime +1 に一致させるには、ファイルは少なくとも 2 日前にアクセスされている必要があります。
-cmin n
ファイルのステータスは n 分以内に、または n 分より前に、またはちょうど n 分前に最終変更されました。
-cnewer reference
現在のファイルの最終ステータス変更時間が、参照ファイルの最終データ変更時間よりも新しい。reference がシンボリックリンクであり、-H オプションまたは -L オプションが有効になっている場合、常に参照先のファイルの最終データ変更時間が使用されます。
-ctime n
ファイルのステータスは n\*24 時間以内に、または n\*24 時間より前に、またはちょうど n\*24 時間前に最終変更されました。-atime のコメントを参照して、ファイルのステータス変更時間の解釈に丸めがどのように影響するかを理解してください。
-empty ファイルは空であり、通常ファイルまたはディレクトリです。
-executable ファイルは実行可能であり、ディレクトリは現在のユーザーがファイル名解決の観点から検索可能である場合に一致します。これは、アクセス制御リストやその他のパーミッションのアーティファクトを考慮します。このテストは access(2) システムコールを使用するため、UID マッピング(またはルートスクワッシュ)を行う NFS サーバーによって欺かれる可能性があります。これは、多くのシステムで access(2) をクライアントカーネルで実装し、サーバー上の UID マッピング情報を使用できないためです。このテストは access(2) システムコールの結果のみに基づいており、このテストに成功したファイルが実際に実行できるとは限りません。
-false 常に false です。
-fstype type
ファイルは、type というタイプのファイルシステム上にあります。有効なファイルシステムの種類は、Unix のバージョンによって異なります。Unix のあるバージョンまたは別のバージョンで受け入れられているファイルシステムの種類の一部を次に示します。ufs、4.2、4.3、nfs、tmp、mfs、S51K、S52K。-printf を使用して %F ディレクティブを指定すると、ファイルシステムのタイプを確認できます。
-gid n ファイルの数値グループ ID は n より小さいか、大きいか、または n と完全に一致します。
-group gname
ファイルは gname というグループに属します(数値グループ ID が許可されます)。
-ilname pattern
-lname と同様ですが、一致はケースインセンシティブです。-L オプションまたは -follow オプションが有効になっている場合、シンボリックリンクが壊れている場合は、このテストは false を返します。
-iname パターン
-name と同様ですが、大文字と小文字を区別しません。たとえば、パターン `fo*` と `F??` は、ファイル名 `Foo`、`FOO`、`foo`、`fOo` などに一致します。パターン `*foo*` は、`.foobar` というファイルにも一致します。
-inum n
ファイルの inode 番号が n より小さい、大きい、または n と等しい。通常は、-samefile テストを使用する方が簡単です。
-ipath パターン
-path と同様ですが、大文字と小文字を区別しません。
-iregex パターン
-regex と同様ですが、大文字と小文字を区別しません。
-iwholename パターン
-ipath を参照してください。この代替方法は、-ipath よりも移植性が低くなります。
-links n
ファイルが持つハードリンクの数が n より少ない、多い、または n と等しい。
-lname パターン
ファイルがシンボリックリンクであり、その内容がシェルパターン パターン に一致します。メタ文字は \ または . を特別に扱いません。-L オプションまたは -follow オプションが有効になっている場合、このテストは、シンボリックリンクが壊れている場合にのみ false を返します。
-mmin n
ファイルのデータが最後に変更されてから n 分未満、n 分より後、またはちょうど n 分経過している。
-mtime n
ファイルのデータが最後に変更されてから n * 24 時間未満、n * 24 時間より後、またはちょうど n * 24 時間経過している。-atime のコメントを参照して、ファイルの変更時刻の丸めが解釈にどのように影響するかを理解してください。
-name パターン
ファイル名のベース(先頭のディレクトリを削除したパス)がシェルパターン パターン に一致します。先頭のディレクトリが削除されるため、パターンにスラッシュを含める必要はありません。なぜなら -name a/b は何も一致しません(代わりに -path を使用することをお勧めします)。ただし、スラッシュのみをパターンとして使用する場合(-name /)は例外です。これは、/ のベース名が / であるため、有効な文字列としてルートディレクトリ / に一致します。スラッシュを 1 つだけ含むパターンを渡すと、環境変数 POSIXLY_CORRECT が設定されている場合、またはオプション -nowarn が使用されている場合を除き、警告が表示されます。
ディレクトリとその中のファイルを無視するには、すべてのファイルをチェックするのではなく、-prune を使用します。例については、そのアクションの説明を参照してください。中括弧は特別なものとして認識されません。Bash を含む一部のシェルでは、中括弧がシェルパターンで特別な意味を持つためです。ファイル名の照合は、fnmatch(3) ライブラリ関数を使用して実行されます。パターンを引用符で囲んで、シェルの展開から保護することを忘れないでください。
-newer 参照
現在のファイルのデータの最終変更時刻が、参照ファイルのデータの最終変更時刻よりも新しい。参照がシンボリックリンクであり、-H オプションまたは -L オプションが有効になっている場合、常に参照先のファイルのデータの最終変更時刻が使用されます。
-newerXY 参照
X のタイムスタンプを持つファイルが、Y のタイムスタンプを持つ参照ファイルよりも新しい場合に成功します。文字 X と Y は、次の文字のいずれかになります。
a ファイル参照のアクセス時刻
B ファイル参照の作成時刻
c ファイル参照のinodeステータス変更時刻
m ファイル参照の修正時刻
t 参照は、時間として直接解釈されます。
無効な組み合わせも存在します。たとえば、Xがtである場合は無効です。また、すべてのシステムでサポートされているわけではない組み合わせもあります。たとえば、Bはすべてのシステムでサポートされていません。無効またはサポートされていないXYの組み合わせが指定された場合、致命的なエラーが発生します。時刻の指定は、GNU dateの-dオプションの引数と同じように解釈されます。参照ファイルの作成時刻を使用しようとして、作成時刻を特定できない場合、致命的なエラーメッセージが表示されます。検査対象のファイルの作成時刻を参照するテストを指定すると、作成時刻が不明なファイルについては、このテストは失敗します。
-nogroup
ファイルに数値グループIDに対応するグループがありません。
-nouser
ファイルに数値ユーザーIDに対応するユーザーがありません。
-path パターン
ファイル名がシェルパターン「パターン」に一致します。メタ文字は\/または` .を特別に扱いません。したがって、たとえば
find . -path "./sr*sc"
は、./src/miscという名前のディレクトリが存在する場合、そのディレクトリのエントリを出力します。ディレクトリツリー全体を無視する場合は、すべてのファイルをチェックする代わりに、-pruneを使用します。-path引数は、コマンド行で指定された開始点から始まるファイル名の全体と比較されます。絶対パス名を絶対パスとして使用する場合、関連する開始点も絶対パスである必要があります。これは、次のコマンドが一致するものがないことを意味します。
find bar -path /foo/bar/myfile -print
^indは、-path引数を、検査対象のディレクトリ名とファイル名の基本名を連結した文字列と比較します。連結文字列はスラッシュで終わることはないため、-path引数がスラッシュで終わる場合、一致するものはありません(ただし、コマンド行で指定された開始点である場合は例外です)。-path述語はHP-UXのfind`でもサポートされており、POSIX 2008標準の一部です。
-perm モード
ファイルのパーミッションビットが、正確にモード(8進数または記号)に一致します。正確な一致が必要なため、記号モードを使用する場合は、かなり複雑なモード文字列を指定する必要がある場合があります。たとえば、-perm g=wは、モードが0020(つまり、グループ書き込みパーミッションのみが設定されているファイル)に一致するファイルにのみ一致します。通常は、/または-形式を使用する方が適切です。たとえば、-perm -g=wは、グループ書き込みパーミッションが設定されているファイルに一致します。例については、EXAMPLESセクションを参照してください。
-perm -モード
ファイルのすべてのパーミッションビットが、モードに設定されています。この形式では記号モードも受け入れられます。記号モードを使用する場合は、u、g、またはoを指定する必要があります。例については、EXAMPLESセクションを参照してください。
-perm /モード
ファイルのいずれかのパーミッションビットが、モードに設定されています。この形式では記号モードも受け入れられます。記号モードを使用する場合は、u、g、またはoを指定する必要があります。例については、EXAMPLESセクションを参照してください。モードに設定されているパーミッションビットがない場合、このテストはすべてのファイルに一致します(この場合の考え方は、-perm -000の動作と一貫性を保つことです)。
-perm +mode
これはサポートされなくなりました(2005年以降、非推奨となっています)。代わりに、-perm /mode を使用してください。
-readable
現在のユーザーが読み取り可能なファイルに一致します。これには、アクセス制御リストやその他の権限アーティファクトが考慮されます。-perm テストでは考慮されません。このテストでは、access(2) システムコールが使用されるため、UID マッピング(またはルート・スクワッシング)を行う NFS サーバーによって欺かれる可能性があります。これは、多くのシステムが access(2) をクライアントのカーネルに実装しているため、サーバーに保存されている UID マッピング情報を使用できないからです。
-regex pattern
ファイル名が正規表現パターンに一致します。これは、パス全体に対する一致であり、検索ではありません。たとえば、./fubar3 というファイルに一致するには、`.*bar.' または `.*b.*3' という正規表現を使用できますが、`f.*r3' は使用できません。find で使用できる正規表現は、デフォルトでは Emacs 正規表現ですが、-regextype オプションを使用して変更できます。
-samefile name
ファイルが name と同じ inode を参照します。-L が有効になっている場合、これにはシンボリックリンクが含まれる可能性があります。
-size n[cwbkMG]
ファイルが n ユニット未満、または n ユニットより多くのスペースを使用するか、n ユニットちょうど使用します。この値は切り上げられます。次のサフィックスを使用できます。
`b' は 512 バイトブロック(サフィックスが指定されていない場合はこれがデフォルト)
`c' はバイト
`w' は 2 バイトワード
`k' はキビバイト(KiB、1024 バイト単位)
`M' はメビバイト(MiB、1024 * 1024 = 1048576 バイト単位)
`G' はギビバイト(GiB、1024 * 1024 * 1024 = 1073741824 バイト単位)
サイズは、lstat(または stat)システムコールによって入力された struct stat の st_size メンバーであり、上記の通り、切り上げられます。言い換えれば、これは ls -l で得られる結果と一貫性があります。-printf の %k' および%b' 形式指定子で、スパースファイルが異なる方法で処理されることに注意してください。`b' サフィックスは常に 512 バイトブロックを意味し、1024 バイトブロックを意味することはありません。これは、-ls の動作とは異なります。
-
および - プレフィックスは、それぞれ「より大きい」および「より小さい」を意味します。つまり、正確なサイズ n ユニットに一致するわけではありません。サイズは次のユニットに切り上げられることに注意してください。したがって、-size -1M は -size -1048576c と同じではありません。前者は空のファイルにのみ一致し、後者は 0 ~ 1,048,575 バイトのファイルに一致します。
-true 常に真。
-type c ファイルがタイプ c であること:
b ブロック(バッファリングされた)特殊ファイル
c キャラクタ(バッファリングされていない)特殊ファイル
d ディレクトリ
p 名前付きパイプ(FIFO)
f 通常ファイル
l シンボリックリンク。これは、-L オプションまたは -follow オプションが有効になっている場合は真になりません。ただし、シンボリックリンクが壊れている場合は例外です。-L が有効になっているときにシンボリックリンクを検索する場合は、-xtype を使用します。
s ソケット
D ドア (Solaris)
複数のタイプを一度に検索するには、コンマ , で区切ったタイプの文字のリストを指定できます (GNU拡張)。
-uid n ファイルの数値ユーザーIDが n より小さい、大きい、または n と等しい。
-used n
ファイルが最後にアクセスされたのは、ステータスが最後に変更されてから n 日より前、後、またはちょうど n 日後である。
-user uname
ファイルはユーザー uname によって所有されている (数値ユーザーIDも許可)。
-wholename pattern
-path を参照。この代替方法は、-path よりも移植性が低い。
-writable
現在のユーザーが書き込み可能なファイルに一致する。これは、アクセス制御リストやその他の権限アーティファクトを考慮に入れるため、-perm テストとは異なる。このテストでは access(2) システムコールが使用されるため、UID マッピング (またはルートスクワッシュ) を行う NFS サーバーによって欺かれる可能性がある。多くのシステムでは access(2) をクライアントカーネルに実装するため、サーバーに保存されている UID マッピング情報を使用できないためである。
-xtype c
ファイルがシンボリックリンクでない場合は、-type と同じ。シンボリックリンクの場合:-H または -P オプションが指定されている場合は、ファイルがタイプ c のファイルへのリンクである場合に真となる。-L オプションが指定されている場合は、c が l の場合に真となる。言い換えれば、シンボリックリンクの場合、-xtype は -type がチェックしないファイルのタイプをチェックする。シンボリックリンクが壊れている場合 (リンク先のファイルが存在しないか、リンクが自身を指している場合)、-xtype は -type と同じように動作する。
-context pattern
(SELinux のみ) ファイルのセキュリティコンテキストが glob パターンと一致する。
アクション
-delete
ファイルまたはディレクトリを削除する。削除に成功した場合は真となる。削除に失敗した場合は、エラーメッセージが表示され、find の終了ステータスはゼロ以外の値になる (最終的に終了するまで)。
警告:find はコマンドラインを式として評価することに注意してください。したがって、最初に -delete を配置すると、find は指定した開始点以下のすべてのものを削除しようとします。
-delete アクションを使用すると、自動的に -depth オプションが有効になります。また、-depth は -prune を効果的にしないため、-delete アクションは -prune と組み合わせて使用することはできません。
多くの場合、ユーザーは -print を使用して find コマンドラインをテストしてから、実際の削除のために -delete を追加したいと考えています。予期しない結果を避けるために、これらの初期のテスト実行中に -depth を明示的に使用するのが最善です。
-delete アクションは、ディレクトリが空でない場合、ディレクトリを削除できません。
-ignore_readdir_race オプションとともに、find は、親ディレクトリが読み込まれてからファイルが消失した場合に、-delete アクションのエラーを無視します。エラー診断は出力されず、終了コードはゼロ以外の値に変更されず、-delete アクションの戻り値は真となります。
-exec command ;
コマンドを実行する。0 のステータスが返された場合は真となる。find に続くすべての引数は、; で終わる引数に出会うまで、コマンドの引数として扱われます。文字列 {} は、コマンドの引数の中で、処理中の現在のファイル名に置き換えられます。これは、find の一部のバージョンでは、引数の中で単独で使用されている場合にのみ置き換えられるのとは異なります。これらの構造は、シェルによる展開から保護するために、エスケープ (\) または引用符で囲む必要がある場合があります。-exec オプションの使用例については、EXAMPLES セクションを参照してください。指定されたコマンドは、一致するファイルごとに 1 回実行されます。コマンドは、開始ディレクトリで実行されます。-exec アクションの使用には、避けられないセキュリティ上の問題があるため、-execdir オプションを使用する方が良いでしょう。
-exec command {} +
この -exec オプションは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは各選択されたファイル名を末尾に追加して構築されます。そのため、コマンドの実行回数は、一致したファイルの総数よりも大幅に少なくなります。コマンドラインは、xargs がコマンドラインを構築するのと同じ方法で構築されます。{} のインスタンスは 1 つだけ許可され、それは末尾に配置され、+ の直前に配置される必要があります。シェルによる解釈から保護するために、\ でエスケープするか、引用符で囲む必要があります。コマンドは、開始ディレクトリで実行されます。+ 形式で実行されたいずれかのコマンドがゼロ以外の終了ステータスを返した場合、find はゼロ以外の終了ステータスを返します。find がエラーに遭遇した場合、これは即座に終了を引き起こす可能性があり、そのため、保留中のコマンドがまったく実行されない可能性があります。この理由から、-exec my-command ... {} + -quit は、my-command が実際に実行されるとは限りません。この -exec のバリアントは常に true を返します。
-execdir command ;
-execdir command {} +
-exec と同様ですが、指定されたコマンドは、一致したファイルを含むサブディレクトリから実行されます。通常、これは find を開始したディレクトリではありません。-exec と同様に、find がシェルから呼び出される場合は、{} を引用符で囲む必要があります。これは、一致したファイルのパスを解決する際の競合状態を回避するため、より安全な方法です。-exec の場合と同様に、-execdir の + 形式は、複数の一致したファイルを処理するためにコマンドラインを構築しますが、特定のコマンドの実行では、同じサブディレクトリに存在するファイルのみがリストされます。このオプションを使用する場合は、PATH 環境変数が . を参照しないようにする必要があります。そうしないと、攻撃者は、find が -execdir を実行するディレクトリに適切に名前を付けたファイルを作成することにより、任意のコマンドを実行できます。PATH に空のエントリまたは絶対ディレクトリ名ではないエントリが含まれている場合も同様です。+ 形式で実行されたいずれかのコマンドがゼロ以外の終了ステータスを返した場合、find はゼロ以外の終了ステータスを返します。find がエラーに遭遇した場合、これは即座に終了を引き起こす可能性があり、そのため、保留中のコマンドがまったく実行されない可能性があります。アクションの結果は、+ または ; のバリアントのどちらが使用されているかによって異なります。-execdir command {} + は常に true を返し、-execdir command {} ; は、コマンドが 0 を返す場合にのみ true を返します。
-fls file
真。-lsと同様だが、-fprintのようにファイルに書き込む。出力ファイルは、述語が一致しなくても常に作成される。詳しくは、UNUSUAL FILENAMESセクションのファイル名に関する情報を参照。
-fprint file
真。ファイルファイルに完全なファイル名を出力する。ファイルが存在しない場合にfindが実行されると、ファイルが作成される。存在する場合は、ファイルが切り捨てられる。ファイル/dev/stdoutおよび/dev/stderrは、それぞれ標準出力および標準エラー出力を示す特別な方法で処理される。出力ファイルは、述語が一致しなくても常に作成される。詳しくは、UNUSUAL FILENAMESセクションのファイル名に関する情報を参照。
-fprint0 file
真。-print0と同様だが、-fprintのようにファイルに書き込む。出力ファイルは、述語が一致しなくても常に作成される。詳しくは、UNUSUAL FILENAMESセクションのファイル名に関する情報を参照。
-fprintf file format
真。-printfと同様だが、-fprintのようにファイルに書き込む。出力ファイルは、述語が一致しなくても常に作成される。詳しくは、UNUSUAL FILENAMESセクションのファイル名に関する情報を参照。
-ls 真。現在のファイルをls -dils形式で標準出力にリストする。ブロック数は1KBブロックである。ただし、環境変数POSIXLY_CORRECTが設定されている場合は、512バイトブロックが使用される。詳しくは、UNUSUAL FILENAMESセクションのファイル名に関する情報を参照。
-ok command ;
-execと同様だが、最初にユーザーに尋ねる。ユーザーが同意した場合、コマンドを実行する。それ以外の場合は、falseを返すだけ。コマンドが実行された場合、その標準入力は/dev/nullからリダイレクトされる。このアクションは、-files0-fromオプションと一緒に指定することはできない。
応答は、肯定または否定の応答であるかどうかを判断するために、一対の正規表現と照合される。この正規表現は、POSIXLY_CORRECT環境変数が設定されている場合はシステムから取得され、それ以外の場合はfindのメッセージ翻訳から取得される。システムに適切な定義がない場合、find自身の定義が使用される。いずれの場合も、正規表現自体の解釈は、環境変数LC_CTYPE(文字クラス)およびLC_COLLATE(文字範囲と等価クラス)によって影響を受ける。
-okdir command ;
-execdirと同様だが、-okの場合と同様に、最初にユーザーに尋ねる。ユーザーが同意しない場合は、falseを返すだけ。コマンドが実行された場合、その標準入力は/dev/nullからリダイレクトされる。このアクションは、-files0-fromオプションと一緒に指定することはできない。
-print 真。完全なファイル名を標準出力に、その後に改行を出力する。findの出力を別のプログラムにパイプで渡す場合、検索するファイルに改行が含まれている可能性がある場合は、-print0オプションを-printの代わりに検討する価値がある。詳しくは、UNUSUAL FILENAMESセクションのファイル名に関する情報を参照。
-print0
True。標準出力にファイル名の完全なパスを出力し、その後にヌル文字を付加します(-printが使用する改行文字の代わりに)。これにより、改行やその他の空白を含むファイル名であっても、findの出力を処理するプログラムによって正しく解釈できるようになります。このオプションは、xargsの-0オプションに対応します。
-printf format
True。formatを標準出力に出力し、\`エスケープシーケンスと\`%`ディレクティブを解釈します。フィールドの幅と精度は、[printf]({filename}../../printf)(3) C関数と同様に指定できます。多くのフィールドは%sとして出力されるため、フラグが期待どおりに機能しない場合があります。また、`-`フラグは機能します(フィールドを左寄せにします)。-printとは異なり、-printfは文字列の末尾に改行を追加しません。エスケープシーケンスとディレクティブは次のとおりです。
\a アラームベル。
\b バックスペース。
\c このフォーマットからの印刷を直ちに停止し、出力をフラッシュします。
\f フォームフィード。
\n 改行。
\r キャリッジリターン。
\t 水平タブ。
\v 垂直タブ。
\0 ASCII NUL。
\\ リテラルのバックスラッシュ(\`\`)。
\NNN ASCIIコードがNNN(8進数)である文字。
\`に続く任意の文字は、通常の文字として扱われ、そのまま出力されます。
%% リテラルのパーセント記号。
%a ファイルの最終アクセス時刻を、Cのctime(3)関数が返す形式で出力します。
%Ak ファイルの最終アクセス時刻を、kで指定された形式で出力します。kは`@`またはCのstrftime(3)関数のディレクティブです。以下の表は、可能な値の不完全なリストを示します。完全なリストについては、strftime(3)のドキュメントを参照してください。実装の違いにより、変換指定文字の一部はすべてのシステムで利用できない場合があります。
@ 1970年1月1日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.00..61.00)。小数部を含みます。
T 24時間形式の時間(hh:mm:ss.xxxxxxxxxx)
+ 日付と時刻を`+`で区切ります。例:`2004-04-28+22:22:05.0`。これはGNU拡張です。時刻は現在のタイムゾーン(TZ環境変数によって変更される可能性があります)で表されます。秒フィールドには小数部が含まれます。
X ロケールの時間表現(H:M:S)。秒フィールドには小数部が含まれます。
Z タイムゾーン(例:EDT)。タイムゾーンが判別できない場合は、何も出力されません。
日付フィールド:
a ロケールの省略された曜日名(Sun..Sat)
A ロケールの完全な曜日名、可変長(Sunday..Saturday)
b ロケールの省略された月名(Jan..Dec)
B ロケールの完全な月名、可変長(January..December)
c ロケールの現在時刻(Sat Nov 04 12:02:33 EST 1989)。書式は ctime(3) と同じであり、互換性を保つために、秒フィールドには小数部は含まれません。
d 月の日(01..31)
D 日付(mm/dd/yy)
F 日付(yyyy-mm-dd)
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バイトブロック単位。ディスクスペースはファイルシステムのブロックサイズの倍数で割り当てられるため、通常は %s/512 よりも大きくなりますが、ファイルがスパースファイルの場合は小さくなることもあります。
%Bk ファイルの作成時刻。書式は k で指定され、%A と同じです。基盤となるオペレーティングシステムまたはファイルシステムが作成時刻をサポートしていない場合、このディレクティブは空の文字列を生成します。
%c ファイルの最終ステータス変更時刻。ctime(3) 関数によって返される書式です。
%Ck ファイルの最終ステータス変更時刻。書式は k で指定され、%A と同じです。
%d ディレクトリツリー内のファイルの深さ。0 はファイルが開始点であることを意味します。
%D ファイルが存在するデバイス番号(struct stat の st_dev フィールド)。10進数で表示されます。
%f ベース名(ファイル名から先頭のディレクトリを削除した名前。最後の要素のみ)。/ の場合、結果は / になります。例については、EXAMPLES セクションを参照してください。
%F ファイルが存在するファイルシステムのタイプ。これは -fstype に使用できます。
%g ファイルのグループ名。または、グループ名が存在しない場合は数値のグループ ID。
%G ファイルの数値のグループ ID。
%h ディレクトリ名。ファイルの名の先頭ディレクトリ(最後の要素を除く)。ファイル名にスラッシュが含まれていない場合(現在のディレクトリにある場合)、%h は . に展開されます。ファイル自体がディレクトリであり、スラッシュ(/ を含む)を含む場合、%h は空の文字列に展開されます。例については、EXAMPLES セクションを参照してください。
%H ファイルが見つかった開始点。
%i ファイルの inode 番号(10進数)。
%k このファイルが占有するディスクスペース。1 KB ブロック単位。ディスクスペースはファイルシステムのブロックサイズの倍数で割り当てられるため、通常は %s/1024 よりも大きくなりますが、ファイルがスパースファイルの場合は小さくなることもあります。
%l シンボリックリンクのターゲット(ファイルがシンボリックリンクでない場合は空の文字列)。
%m ファイルのパーミッションビット(8進数)。ほとんどの Unix 実装で「従来の」数値が使用されますが、実装によっては 8進数パーミッションビットの順序が異なるため、実際のファイルモード値と %m の出力に違いが生じる場合があります。通常、先頭にゼロを付けて表示する必要があり、これを行うには # フラグを使用します(例:`%#m`)。
%M ファイルのパーミッション(lsと同様の記号形式)。このディレクティブは、findutils 4.2.5以降でサポートされます。
%n ファイルへのハードリンクの数。
%p ファイル名。
%P ファイル名で、ファイルが見つかった開始点からのパスを削除したもの。
%s ファイルのサイズ(バイト単位)。
%S ファイルのスパース性。これは(BLOCKSIZE * st_blocks / st_size)として計算されます。特定の長さの通常のファイルの場合、正確な値はシステムに依存します。ただし、通常、スパースファイルは1.0未満の値になり、間接ブロックを使用するファイルは1.0を超える値になることがあります。一般に、ファイルが使用するブロックの数はファイルシステムに依存します。BLOCKSIZEに使用される値はシステムに依存しますが、通常は512バイトです。ファイルサイズがゼロの場合、出力される値は未定義です。st_blocksのサポートがないシステムでは、ファイルのスパース性は1.0と見なされます。
%t ファイルの最終変更時刻。Cのctime(3)関数によって返される形式。
%Tk ファイルの最終変更時刻。kで指定された形式で、これは%Aと同様です。
%u ファイルが属するユーザー名。または、ユーザー名がない場合は数値ユーザーID。
%U ファイルの数値ユーザーID。
%y ファイルの種類(ls -lと同様)。U = 不明なタイプ(通常は発生しません)。
%Y ファイルの種類(%yと同様)、およびシンボリックリンクをたどります。`L` = ループ、`N` = 存在しない、`?` = シンボリックリンクのターゲットのタイプを決定する際に発生したその他のエラー。
%Z (SELinuxのみ)ファイルのセキュリティコンテキスト。
%{ %[ %(
将来の使用のために予約されています。
`%`文字の後に続く任意の文字は破棄されますが、その文字は出力されます(ただし、これに依存しないでください。なぜなら、他のフォーマット文字が追加される可能性があるからです)。フォーマット引数の最後に`%`文字がある場合、その後の文字がないため、未定義の動作になります。一部のロケールでは、家の鍵を隠したり、読んでいる小説の最後のページを削除したりする可能性があります。
%mと%dのディレクティブは、#、0、および+フラグをサポートしますが、他のディレクティブはサポートしません。数値ディレクティブでこれらのフラグをサポートしないものには、G、U、b、D、k、およびnが含まれます。`-`フォーマットフラグはサポートされており、フィールドの配置をデフォルトの右寄せから左寄せに変更します。
UNUSUAL FILENAMESセクションを参照して、ファイル名内の異常な文字の処理方法を確認してください。
-prune 真。ファイルがディレクトリである場合、そのディレクトリには降り込まれません。-depthが指定されている場合、-pruneは効果がありません。-deleteは-depthを暗黙的に意味するため、-pruneと-deleteを組み合わせて使用しても意味がありません。たとえば、ディレクトリsrc/emacsとそのすべての子ファイルおよびディレクトリをスキップし、他のファイルの名前を出力するには、次のようにします。
find . -path ./src/emacs -prune -o -print
-quit: 直ちに終了し、エラーが発生していない場合はリターン値 0 を返します。これは -prune と異なります。-prune は、プルーニングされたディレクトリの内容にのみ適用されますが、-quit は単に find の実行を直ちに停止します。子プロセスは何も残されません。-exec ... + または -execdir ... + によって構築されたコマンドラインは、プログラムが終了する前に呼び出されます。-quit が実行された後、コマンドラインで指定されたファイルはそれ以上処理されません。たとえば、`find /tmp/foo /tmp/bar -print -quit` は `/tmp/foo` のみを出力します。
-quit の一般的な使用法は、必要なものを検索したらファイルシステムの検索を停止することです。たとえば、単一のファイルを見つけるには、次のようにします。
find / -name needle -print -quit
オペレーター
優先度の高い順にリストします。
( expr )
優先順位を強制します。括弧はシェルにとって特別な文字であるため、通常は引用符で囲む必要があります。このマニュアルページ内の多くの例では、バックスラッシュを使用して `\(...\)` のように記述します。
! expr 式が偽の場合に真になります。この文字も通常はシェルによって解釈されないように保護する必要があります。
-not expr
! expr と同じですが、POSIX 準拠ではありません。
expr1 expr2
連続する 2 つの式は、暗黙の -a で結合されます。expr1 が偽の場合、expr2 は評価されません。
expr1 -a expr2
expr1 expr2 と同じです。
expr1 -and expr2
expr1 expr2 と同じですが、POSIX 準拠ではありません。
expr1 -o expr2
または。expr1 が真の場合、expr2 は評価されません。
expr1 -or expr2
expr1 -o expr2 と同じですが、POSIX 準拠ではありません。
expr1 , expr2
リスト。expr1 と expr2 の両方が常に評価されます。expr1 の値は破棄され、リストの値は expr2 の値になります。カンマ演算子は、ファイルシステム階層を 1 回だけトラバースしながら、いくつかの異なる種類のものを検索する場合に役立ちます。-fprintf アクションを使用して、さまざまな一致したアイテムをいくつかの異なる出力ファイルにリストできます。
-a が暗黙的(たとえば、明示的な演算子なしで 2 つのテストが連続して出現する場合)または明示的に指定されている場合、-o よりも優先度が高いことに注意してください。これは、`find . -name afile -o -name bfile -print` が afile を決して出力しないことを意味します。
珍しいファイル名
find のアクションの多くは、他のユーザーが制御するデータの出力につながります。これには、ファイル名、サイズ、修正時間などが含まれます。ファイル名は潜在的な問題です。ファイルには、\0 と / 以外の任意の文字を含めることができるためです。ファイル名内の珍しい文字は、予期しない、そしてしばしば望ましくない方法でターミナルに影響を与える可能性があります(たとえば、一部のターミナルでファンクションキーの設定を変更します)。珍しい文字は、さまざまなアクションによって異なって処理されます。以下に説明します。
-print0、-fprint0
常にファイル名を変更せずに正確に表示します。出力先がターミナルであっても同様です。
-ls、-fls
特殊文字は常にエスケープされます。空白、バックスラッシュ、および二重引用符は、Cスタイルのエスケープを使用して表示されます(例:`\f'、`\"')。他の特殊文字は、8進数エスケープを使用して表示されます。他の印刷可能な文字(-ls および -fls の場合、これは 8 進数 041 から 0176 の範囲の文字です)は、そのまま表示されます。
-printf、-fprintf
出力先がターミナルでない場合、そのまま表示されます。それ以外の場合、結果は使用されているディレクティブによって異なります。ディレクティブ %D、%F、%g、%G、%H、%Y、および %y は、ファイルの所有者の制御下にない値に拡張されるため、そのまま表示されます。ディレクティブ %a、%b、%c、%d、%i、%k、%m、%M、%n、%s、%t、%u、および %U は、ファイルの所有者の制御下にあり、ターミナルに任意のデータを送信するために使用できない値に拡張されるため、そのまま表示されます。ディレクティブ %f、%h、%l、%p、および %P は引用符で囲まれます。この引用符は、GNU ls で使用されるものと同じ方法で実行されます。これは、-ls および -fls で使用される引用符メカニズムとは異なります。find の出力形式を決定できる場合は、通常、改行の代わりに `\0' をターミネータとして使用する方が適切です。ファイル名には空白文字と改行文字が含まれる可能性があるためです。LC_CTYPE 環境変数の設定は、どの文字を引用符で囲む必要があるかを決定するために使用されます。
-print、-fprint
引用符は、-printf および -fprintf と同じ方法で処理されます。find をスクリプトで使用する場合、または一致したファイルに任意の名前が付けられる可能性がある場合に、-print ではなく -print0 を使用することを検討してください。
-ok および -okdir アクションは、現在のファイル名をそのまま表示します。これは将来のリリースで変更される可能性があります。
標準への準拠
最も POSIX 標準に準拠するには、POSIXLY_CORRECT 環境変数を設定する必要があります。次のオプションは、POSIX 標準 (IEEE Std 1003.1-2008, 2016 Edition) で指定されています。
-H このオプションはサポートされています。
-L このオプションはサポートされています。
-name このオプションはサポートされていますが、POSIX 準拠は、システムの fnmatch(3) ライブラリ関数の POSIX 準拠に依存します。findutils-4.2.2 以降、シェルメタ文字 (`*`、`?`、または `[]` など) は先頭の `.` に一致します。これは、IEEE PASC 解釈 126 で必要とされているためです。これは、findutils の以前のバージョンからの変更です。
-type サポートされています。POSIX は `b`、`c`、`d`、`l`、`p`、`f`、および `s` を指定します。GNU find は、OS が提供する場合、Door を表す `D` もサポートします。さらに、GNU find では、複数のタイプをカンマ区切りのリストで一度に指定できます。
-ok サポートされています。応答の解釈は、LC_MESSAGES 環境変数の設定によって選択された `yes` および `no` パターンに従います。POSIXLY_CORRECT 環境変数が設定されている場合、これらのパターンは、システムの肯定 (`yes`) または否定 (`no`) の応答の定義から取得されます。システムのマニュアルの nl_langinfo(3) を参照してください。特に、YESEXPR および NOEXPR を参照してください。POSIXLY_CORRECT が設定されていない場合、パターンは代わりに find 独自のメッセージカタログから取得されます。
-newer はサポートされています。指定されたファイルがシンボリックリンクの場合、常にリンク先が参照されます。
これは、以前の動作からの変更であり、以前はシンボリックリンクから関連する時間を取得していました。詳細は、HISTORYセクションを参照してください。
-perm はサポートされています。POSIXLY_CORRECT 環境変数が設定されていない場合、POSIXでは無効ないくつかのモード引数(例:+a+x)が、互換性のためにサポートされます。
その他の主要オプション -atime、-ctime、-depth、-exec、-group、-links、-mtime、-nogroup、-nouser、-ok、-path、-print、-prune、-size、-user、および -xdev はすべてサポートされています。
POSIX標準は、括弧 (、)、否定 !、および論理演算子 -a および -o を指定しています。
他のすべてのオプション、述語、式などは、POSIX標準を超える拡張機能です。これらの拡張機能の多くは、GNU find に固有のものではありません。
POSIX標準では、find がループを検出することが求められています。
find ユーティリティは、無限ループ(以前にアクセスしたディレクトリであり、最後のファイルで遭遇したディレクトリの祖先であるディレクトリに再入る)を検出する必要があります。ループを検出した場合、find は標準エラーに診断メッセージを書き出し、階層内の位置を回復するか、終了します。
GNU find はこれらの要件に準拠しています。ハードリンクが祖先に向けられているエントリを含むディレクトリのリンクカウントは、通常、そうでない場合よりも低くなります。これは、GNU find が実際にそのようなサブディレクトリにアクセスしないため、診断メッセージを出力する必要がないことを意味します。-noleaf が使用されている場合、ディレクトリエントリは常に検査され、適切な場合に診断メッセージが出力されます。シンボリックリンクを使用してファイルシステムのサイクルを作成することはできませんが、-L オプションまたは -follow オプションが使用されている場合、find がシンボリックリンクのループに遭遇すると、診断メッセージが出力されます。ハードリンクを含むループと同様に、リーフ最適化によって、find がシンボリックリンクで stat() または chdir() を呼び出す必要がないことがわかっていることが多いため、この診断は頻繁には必要ありません。
-d オプションは、さまざまな BSD システムとの互換性のためにサポートされていますが、POSIX 準拠のオプションである -depth を使用する必要があります。
POSIXLY_CORRECT 環境変数は、-regex または -iregex テストの動作に影響を与えません。これらのテストは POSIX 標準で指定されていないためです。
環境変数
LANG 未設定または null の国際化変数のデフォルト値を指定します。
LC_ALL 設定されていて、かつ空でない文字列の場合、他のすべての国際化変数の値をオーバーライドします。
LC_COLLATE
POSIX 標準では、この変数が -name オプションで使用されるパターンマッチングに影響を与えることが規定されています。GNU find は fnmatch(3) ライブラリ関数を使用するため、LC_COLLATE のサポートはシステムライブラリに依存します。この変数は、-ok への応答の解釈にも影響を与えます。LC_MESSAGES 変数は、-ok への応答の解釈に使用される実際のパターンを選択しますが、パターン内のブラケット式の解釈は LC_COLLATE によって影響を受けます。
LC_CTYPE
この変数は、正規表現で使用される文字クラスの処理と、システム fnmatch(3) ライブラリ関数がこれをサポートする場合の -name テストに影響を与えます。この変数はまた、-ok プロンプトによって使用される正規表現内の文字クラスの解釈にも影響を与えます。LC_CTYPE 環境変数は、ファイル名が印刷されるときにどの文字が印刷不能と見なされるかにも影響します。詳細は、UNUSUAL FILENAMES のセクションを参照してください。
LC_MESSAGES
使用するロケールを決定して、国際化されたメッセージを表示します。POSIXLY_CORRECT 環境変数が設定されている場合、これはまた、-ok アクションによって生成されたプロンプトへの応答の解釈も決定します。
NLSPATH
国際化されたメッセージカタログの場所を決定します。
PATH -exec、-execdir、-ok、および -okdir によって呼び出される実行可能ファイルを検索するディレクトリに影響を与えます。
POSIXLY_CORRECT
-ls および -fls によって使用されるブロックのサイズを決定します。POSIXLY_CORRECT が設定されている場合、ブロックは 512 バイトの単位になります。設定されていない場合、ブロックは 1024 バイトの単位になります。
この変数を設定すると、警告メッセージがデフォルトでオフになります (つまり、-nowarn を意味します)。これは、POSIX では、-ok の出力を除いて、stderr に出力されるすべてのメッセージは診断であり、ゼロ以外の終了ステータスをもたらす必要があるためです。
POSIXLY_CORRECT が設定されていない場合、+zzz が有効なシンボリックモードでない場合、-perm +zzz は -perm /zzz と同じように扱われます。POSIXLY_CORRECT が設定されている場合、そのような構文はエラーとして扱われます。
POSIXLY_CORRECT が設定されている場合、-ok アクションによって生成されたプロンプトへの応答は、find 独自のメッセージ翻訳に従ってではなく、システムのメッセージカタログに従って解釈されます。
TZ -printf および -fprintf のいくつかの時間関連のフォーマットディレクティブで使用されるタイムゾーンに影響を与えます。
例
簡単な find|xargs アプローチ
/tmp ディレクトリまたはそのサブディレクトリにある名前が core のファイルを検索して削除します。
$ find /tmp -name core -type f -print | xargs /bin/rm -f
ただし、ファイル名に改行、一重引用符または二重引用符、またはスペースが含まれている場合、これは正しく機能しません。
より安全な find -print0 | xargs -0 のアプローチ
^ tmp ディレクトリ内またはそのサブディレクトリにある名前が core のファイルを検索し、ファイル名またはディレクトリ名にシングルクォート、ダブルクォート、スペース、または改行が含まれていても正しく処理できるように、それらを削除します。
$ find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
^ name テストは -type テストよりも前に実行されます。これは、すべてのファイルに対して stat(2) を呼び出す必要がないようにするためです。
^ ind がファイルシステムをトラバースして一致するファイル名を印刷する時間と、xargs で実行されるプロセスがそのファイルで動作する時間の間に、まだ競合状態が存在することに注意してください。
任意の開始点からの処理
別のプログラム proggy が事前にフィルタリングを行い、ヌル文字で区切られたファイルの大きなリストを作成した場合、それらを開始点として処理し、それらのうちの通常の空のファイルをすべて検索します。
$ proggy | find -files0-from - -maxdepth 0 -type f -empty
^ files0-from - を使用すると、開始点の名前が標準入力、つまりパイプから読み取られることを意味します。-maxdepth 0 は、開始点のファイルのみが検査され、ディレクトリ(開始点にディレクトリが含まれている場合)に再帰的にアクセスしないようにします。
各ファイルに対してコマンドを実行する
現在のディレクトリ内またはそのサブディレクトリにあるすべてのファイルに対して file コマンドを実行します。
$ find . -type f -exec file '{}' \;
波括弧は、シェルスクリプトの句読記号として解釈されないようにシングルクォートで囲まれています。セミコロンも同様に、バックスラッシュを使用して保護されていますが、この場合もシングルクォートを使用できます。
多くの場合、パフォーマンスとセキュリティ上の理由から、-exec ... + または、より優れた -execdir ... + 構文を使用することをお勧めします。
ファイルシステムを1回だけトラバースして、2つの異なるアクションを実行する
ファイルシステムを1回だけトラバースして、set-user-IDファイルとディレクトリを /root/suid.txt に、大きなファイルを /root/big.txt にリストします。
$ find / \
\( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
\( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
この例では、行継続文字 \ を最初の2行で使用して、シェルにコマンドを次の行で継続するように指示しています。
ファイルの年齢で検索する
過去24時間に修正された、ホームディレクトリ内のファイルを検索します。
$ find $HOME -mtime 0
このコマンドは、各ファイルの最終修正からの経過時間が24時間で割られ、残りが破棄されるように機能します。つまり、-mtime 0 に一致するには、ファイルが過去24時間以内に修正されている必要があります。
ファイルの権限で検索する
実行可能だが読み取り不可のファイルを検索します。
$ find /sbin /usr/sbin -executable \! -readable -print
所有者とグループに読み取りおよび書き込み権限があり、他のユーザーは読み取りはできるが書き込みはできないファイルを検索します。
$ find . -perm 664
これらの条件を満たすファイルで、他のパーミッションビットも設定されている場合(たとえば、ファイルが実行可能である場合)、一致しません。
所有者とグループに対して読み取りおよび書き込みパーミッションがあり、他のユーザーが読み取り可能であり、追加のパーミッションビット(たとえば、実行ビット)の有無に関係なく、ファイルを検索します。
$ find . -perm -664
これにより、たとえばモード0777を持つファイルに一致します。
所有者、グループ、またはその他のユーザーによって書き込み可能であるファイルを検索します。
$ find . -perm /222
所有者またはグループによって書き込み可能なファイルを検索します。
$ find . -perm /220
$ find . -perm /u+w,g+w
$ find . -perm /u=w,g=w
これら3つのコマンドはすべて同じことを行いますが、最初のコマンドはファイルモードの8進数表現を使用し、他の2つのコマンドは記号形式を使用します。ファイルが所有者とグループの両方によって書き込み可能である必要はありません。どちらか一方で十分です。
所有者とグループの両方によって書き込み可能なファイルを検索します。
$ find . -perm -220
$ find . -perm -g+w,u+w
これら2つのコマンドは同じことを行います。
より複雑なパーミッションでの検索。
$ find . -perm -444 -perm /222 \! -perm /111
$ find . -perm -a+r -perm /a+w \! -perm /a+x
これらの2つのコマンドはどちらも、すべてのユーザーに対して読み取り可能(-perm -444または-perm -a+r)、少なくとも1つの書き込みビットが設定されている(-perm /222または-perm /a+w)、ただし、すべてのユーザーに対して実行可能ではない(! -perm /111または! -perm /a+x)ファイルを検索します。
枝刈り - ファイルとサブディレクトリの省略
/source-dirの内容を/dest-dirにコピーしますが、.snapshotという名前のファイルとディレクトリ(およびその中にあるもの)を省略します。また、名前が~で終わるファイルまたはディレクトリも省略しますが、その内容は省略しません。
$ cd /source-dir
$ find . -name .snapshot -prune -o \( \! -name '*~' -print0 \) \
| cpio -pmd0 /dest-dir
-prune -o ( ... -print0 )という構造は非常に一般的です。この場合の考え方は、-pruneの前に式で、枝刈りされるものを一致させることです。ただし、-pruneアクション自体はtrueを返すため、-oは右側の式が、枝刈りされなかったディレクトリに対してのみ評価されるようにします(枝刈りされたディレクトリの内容はアクセスされず、それらの内容は関係ありません)。右側の括弧内の式は、明確にするためだけです。-print0アクションが、-pruneが適用されなかったものに対してのみ行われることを強調します。デフォルトのand条件は-oよりも強く結合されるため、これはデフォルトですが、括弧は何が起こっているかを示すのに役立ちます。
次のプロジェクトとその関連するSCM管理ディレクトリを含むディレクトリが与えられた場合、プロジェクトのルートを効率的に検索します。
$ find repo/ \
\( -exec test -d '{}/.svn' \; \
-or -exec test -d '{}/.git' \; \
-or -exec test -d '{}/CVS' \; \
\) -print -prune
サンプル出力:
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
この例では、-prune は、すでに検出されたディレクトリへの不要な探索を防ぎます(たとえば、project3/src はすでに project3/.svn が見つかっているため探索しませんが)、兄弟ディレクトリ(project2 および project3)が確実に検出されるようにします。
その他の便利な例
複数のファイルタイプを検索します。
$ find /tmp -type f,d,l
^ tmp ディレクトリ内のファイル、ディレクトリ、およびシンボリックリンクを、カンマで区切られたリストとして(GNU拡張)検索します。これは、より長く、移植性の高い以下のコマンドと同等です。
$ find /tmp \( -type f -o -type d -o -type l \)
特定の名前 needle を持つファイルを検索し、最初に見つかった時点で直ちに停止します。
$ find / -name needle -print -quit
^ printf アクションの %f および %h フォーマットディレクティブの解釈について、いくつかのコーナーケースを例示します。以下に例と出力の一部を示します。
$ find . .. / /tmp /tmp/TRACE compile compile/64/tests/find -maxdepth 0 -printf '[%h][%f]\n'
[.][.]
[.][..]
[][/]
[][tmp]
[/tmp][TRACE]
[.][compile]
[compile/64/tests][find]
終了ステータス
^ ind は、すべてのファイルを正常に処理した場合に 0 のステータスで終了し、エラーが発生した場合は 0 より大きいステータスで終了します。これは非常に広範な説明ですが、戻り値が 0 以外の場合、find の結果の正確性に依存しないでください。
エラーが発生した場合、find は直ちに停止し、指定されたすべてのアクションを完了しない場合があります。たとえば、一部の開始ポイントが調べられなかったり、-exec ... {} + または -execdir ... {} + の保留中のプログラムの呼び出しが実行されなかったりする場合があります。
歴史
^ ind プログラムは、バージョン 5 Unix の Programmer's Workbench プロジェクトの一部として登場し、Dick Haight によって作成されました。Doug McIlroy 著の "A Research UNIX Reader: Annotated Excerpts from the Programmer’s Manual, 1971-1986" には、追加の詳細が記載されています。オンラインで読むことができます: [https://www.cs.dartmouth.edu/~doug/reader.pdf]。
GNU find は、当初 Eric Decker によって作成され、その後 David MacKenzie、Jay Plett、および Tim Wood によって拡張されました。find -print0 と xargs -0 のアイデアは、Dan Bernstein によって提案されました。
互換性
^ indutils-4.2.2 以降、ファイル名パターンで使用されるシェルメタ文字(\*',`?'または`[]'など)は、先頭の.` と一致します。これは、IEEE POSIX 解釈 126 で要求されるためです。
^ indutils-4.3.3 以降、-perm /000 はすべてのファイルと一致するようになりました(以前は一致しませんでした)。
ナノ秒分解能のタイムスタンプは、findutils-4.3.3 で実装されました。
^ indutils-4.3.11 以降、-delete アクションは、失敗した場合に find の終了ステータスを 0 以外の値に設定します。ただし、find は直ちに終了しません。以前は、find の終了ステータスは、-delete の失敗によって影響を受けませんでした。
機能 追加されたバージョン また、次にも含まれる
-files0-from 4.9.0
-newerXY 4.3.3 BSD
-D 4.3.1
-O 4.3.1
-readable 4.3.0
-writable 4.3.0
-executable 4.3.0
-regextype 4.2.24
-exec ... + 4.2.12 POSIX
-execdir 4.2.12 BSD
-okdir 4.2.12
-samefile 4.2.11
-H 4.2.5 POSIX
-L 4.2.5 POSIX
-P 4.2.5 BSD
-delete 4.2.3
-quit 4.2.3
-d 4.2.3 BSD
-wholename 4.2.0
-iwholename 4.2.0
-ignore_readdir_race 4.2.0
-fls 4.0
-ilname 3.8
-iname 3.8
-ipath 3.8
-iregex 3.8
^ perm +MODE 構文は findutils-4.5.12 で削除され、代わりに -perm /MODE を使用するように変更されました。+MODE 構文は findutils-4.2.21 で非推奨となり、これは 2005 年にリリースされました。
バグではないもの
演算子の優先順位による予期せぬ動作
^ ind . -name afile -o -name bfile -print コマンドは afile を決して出力しません。これは実際には find . -name afile -o ( -name bfile -a -print ) と同じです。-a の優先順位は -o よりも高く、演算子が指定されていない場合、-a が暗黙的に使用されます。
「パスは式に先行する必要がある」というエラーメッセージ
$ find . -name *.c -print
find: パスは式に先行する必要がある
find: 述語 `-name'? の後に想定外の引用符なしパターン
これは、シェルがパターン *.c を現在のディレクトリに存在する複数のファイル名に展開し、その結果のファイル名をコマンドラインで find に渡す場合に発生します。
find . -name frcode.c locate.c word_io.c -print
このコマンドは正しく機能しません。なぜなら、-name 述語は引数として正確に 1 つのパターンのみを受け入れるからです。このようなことをするのではなく、パターンを引用符で囲むか、ワイルドカードをエスケープして、find がワイルドカードを含むパターンを使用してファイル名の照合を行うようにします。そうすれば、親シェルによって展開されたファイル名のリストを渡すことはありません。
$ find . -name '*.c' -print
$ find . -name \*.c -print
バグ
^ ind の POSIX 標準で指定されている動作には、本質的にセキュリティ上の問題があり、修正することはできません。たとえば、-exec アクションは本質的に安全ではなく、代わりに -execdir を使用する必要があります。
環境変数 LC_COLLATE は -ok アクションに影響しません。
バグの報告
GNU findutils のオンラインヘルプ: https://www.gnu.org/software/findutils/#get-help 翻訳に関するバグは、https://translationproject.org/team/ に報告してください。
その他の問題は、GNU Savannah のバグトラッカーのフォームから報告してください: (https://savannah.gnu.org/bugs/?group=findutils) GNU findutils パッケージに関する一般的なトピックは、bug-findutils メーリングリストで議論されます: (https://lists.gnu.org/mailman/listinfo/bug-findutils)
著作権
Copyright © 1990–2024 Free Software Foundation, Inc. ライセンスは GPLv3+: GNU GPL バージョン 3 以降です。 (https://gnu.org/licenses/gpl.html)。 これはフリーソフトウェアです。変更および再配布することができます。法で許可されている範囲において、保証は一切ありません。
関連項目
chmod(1)、locate(1)、ls(1)、updatedb(1)、xargs(1)、lstat(2)、stat(2)、ctime(3) fnmatch(3)、 printf(3)、strftime(3)、locatedb(5)、regex(7)
完全なドキュメントは[https://www.gnu.org/software/findutils/find]で確認できます。
または、ローカルで info find を使用して参照できます。