| 原作者 | ディック・ヘイト |
|---|---|
| 開発者 | AT&T ベル研究所 |
| オペレーティング·システム | Unix、Unix ライク、Plan 9、IBM i |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
Unix 系 オペレーティング システムでは、findは、ユーザーが指定した基準に基づいてファイルを検索し、一致した各オブジェクトのパス名を出力するか、別のアクションが要求された場合は、一致した各オブジェクトに対してそのアクションを実行するコマンド ライン ユーティリティです。
目的の開始位置から検索を開始し、階層構造(通常はツリー)のノード(ディレクトリ)を再帰的に走査します。findは、開始ディレクトリの下にマウントされた1つ以上のストレージデバイスに属するパーティションの異なるファイルシステムを走査して検索できます。[1]
可能な検索条件には、ファイル名と一致するパターン、またはファイルの変更時間やアクセス時間と一致する時間範囲が含まれます。デフォルトでは、現在の作業ディレクトリの下にあるすべてのファイルのリストを返しますが、ユーザーは開始ディレクトリの下の任意の最大レベル数に検索を制限できます。
find
関連プログラムは、 (通常はジョブごとに定期的に更新される)locate取得されたインデックス付きファイルのデータベースを使用して、ファイル システム全体でファイルを名前で検索するより高速な方法を提供します。
findcron
歴史
findProgrammer's Workbenchプロジェクトの一部としてバージョン5 Unixに登場し、Dick Haightによってcpioと共に書かれました[2]。これらは一緒に使用されるように設計されていました[3] 。
GNU実装はもともとEric Deckerによって書かれました。その後David MacKenzie、 Jay find Plett、Tim Woodによって強化されました。[4]
findコマンドはIBM iオペレーティングシステムにも移植されています。[5]
構文を見つける
$ find [ -H | -L ]パス... [オペランド式... ]
2 つのオプションは、コマンドがシンボリック リンクをどのように扱うかを制御します。findデフォルトの動作では、シンボリック リンクをたどりません。フラグを指定すると、コマンドはシンボリック リンクをたどります。フラグは、コマンド ライン引数の処理中にのみシンボリック リンクをたどります。これらのフラグは、POSIX 標準で指定されています。[6]一般的な拡張機能は、シンボリック リンクの追跡を明示的に無効にするフラグです。[7] [8]-Lfind-Hfind-P
式の前に少なくとも 1 つのパスが必要です。は内部的にワイルドカードfindを解釈することができ、シェルのグロビングを制御するためにコマンドを慎重に引用符で囲む必要があります。
式要素は、通常、シェル構文では空白として表されるコマンドライン引数の境界によって区切られます。式要素は左から右に評価されます。式要素には、AND (-andまたは-a) や OR (-orまたは)などの論理要素-oや述語 (フィルターやアクション) を含めることができます。
GNU には、findPOSIX で指定されていない多数の追加機能があります。
述語
よく使用されるプライマリには次のものがあります。
-name pattern: ファイル名が指定されたシェルグロブパターンと一致するかどうかをテストします。-type type: ファイルが指定されたタイプであるかどうかをテストします。受け入れられるUnix ファイル タイプは次のとおりです。b:ブロックデバイス(バッファ付き) ;c:キャラクターデバイス(バッファなし) ;d:ディレクトリ;f:通常ファイル;l:シンボリックリンク;p:名前付きパイプ;s:ソケット;D:ドア。
-print: は常に true を返します。現在のファイルの名前と改行をstdoutに出力します。-print0: は常に true を返します。現在のファイルの名前と null 文字をstdoutに出力します。POSIX では必須ではありません。-exec program [arguments...] ;:指定された引数でプログラムを実行し、終了ステータスが 0 の場合は true を返し、それ以外の場合は false を返します。プログラムまたは引数が{}の場合は、現在のパスに置き換えられます (プログラムが{}の場合は、現在のパスを実行可能ファイルとして実行しようとします)。POSIX では、複数の{}findが指定された場合の動作は指定されていません。ほとんどの実装では、すべての{}が現在のパスに置き換えられますが、これは標準的な動作ではありません。-exec program [arguments...] {} +: 常にtrueを返します。指定された引数に可能な限り多くのパスを指定してプログラムを実行します( xargsの場合のように、最大コマンドラインサイズを超えた場合は複数のコマンドが実行されます)。[6]-ok program [arguments...] ;: すべてのパスに対して、ユーザーに確認を求めます。ユーザーが確認した場合 (通常はyまたはyesを入力)、 のように動作します。それ以外の場合は、現在のパスに対してコマンドは実行されず、 false が返されます。-exec program [arguments...] ;-maxdepth: 検索するディレクトリの深さを制限するために使用できます。たとえば、-maxdepth 1検索を現在のディレクトリに制限します。
式で-print0、-print、-exec、 のいずれも使用されていない場合、条件が true とテストされた場合に
-okfind はデフォルトで を実行します。-print
オペレーター
演算子を使用すると、find コマンドの式を拡張できます。演算子は優先順位の降順でリストされています。
( expr ): 優先順位を強制します。! expr: が false の場合は trueexpr;expr1 expr2(またはexpr1 -a expr2): AND。が偽のexpr2場合は評価されませんexpr1。expr1 -o expr2: OR.が trueexpr2の場合は評価されませんexpr1。
$ find . -name 'fileA_*' -o -name 'fileB_*'
このコマンドは、現在の作業ディレクトリ ツリーで、名前がfileA_またはで始まるファイルを検索しますfileB_。 を引用符で囲むfileA_*ことで、シェルが を展開しないようにします。
$ find . -name 'foo.cpp' '!' -path '.svn'
このコマンドは、サブディレクトリ ツリー「.svn」を除く現在の作業ディレクトリ ツリーで、名前が「foo.cpp」のファイルを検索します。 を引用符で囲むのは、!シェルによって履歴置換文字として解釈されないようにするためです。
POSIX による無限出力からの保護
現実世界のファイルシステムには、ハードリンクやソフトリンクを使用して作成されたループ構造が含まれることがよくあります。POSIX標準では、
ユーティリティ
findは、無限ループを検出します。つまり、最後に遭遇したファイルの祖先である、以前にアクセスしたディレクトリに入ります。無限ループを検出すると、find標準エラーに診断メッセージを書き込み、階層内の位置を回復するか、終了します。
例
現在の作業ディレクトリから
$ find . -name 'my*'
これは、現在の作業ディレクトリ ツリーで、名前が my で始まるファイルを検索します。一重引用符はシェルの展開を回避します。一重引用符がないと、シェルはmy* を現在の作業ディレクトリ内のmyで始まるファイルのリストに置き換えます。プログラムの新しいバージョンでは、ディレクトリを省略でき、現在の作業ディレクトリを意味します。
通常のファイルのみ
$検索 . -name 'my*' -type f
これにより、上記の検索の結果が通常のファイルのみに制限され、ディレクトリ、特殊ファイル、シンボリック リンクなどが除外されます。my *は一重引用符 (アポストロフィ) で囲まれています。そうしないと、シェルはこれを、myで始まる現在の作業ディレクトリ内のファイルのリストに置き換えてしまいます。
コマンド
前の例では、デフォルトでアクションfindが実行されるため、結果のリストが作成されました。(コマンドの初期バージョンにはデフォルトのアクションがまったくなかったため、結果として生成されたファイルのリストは破棄され、ユーザーを困惑させていたことに
-print注意してください。)find
$検索 . -name 'my*' -type f -ls
拡張ファイル情報を出力します。
すべてのディレクトリを検索
$ find / -name myfile -type f -print
これは、 myfileという名前の通常のファイルをすべてのディレクトリで検索し、画面に出力します。通常、この方法でファイルを検索するのは良い考えではありません。これにはかなりの時間がかかる可能性があるため、ディレクトリをより正確に指定することをお勧めします。一部のオペレーティング システムでは、 と相性の悪い動的ファイル システムをマウントする場合がありますfind。シェルに固有の文字を含むより複雑なファイル名は、一重引用符で囲む必要がある場合があります。
1つのサブディレクトリツリーを除くすべてを検索
$ find / -path 除外 パス -prune -o -type f -name myfile -print
これは、アクションによって削除されたサブディレクトリ ツリーのexcluded_pa th (先頭の / を含む完全なパス)を除くすべてのディレクトリで、名前がmyfile-pruneである通常のファイルを検索します。
ディレクトリを指定
$ find /home/weedly -name myfile -type f -print
これは、/home/weedlyディレクトリ ツリーで、 myfileという名前の通常のファイルを検索します。常に、覚えている最も深いレベルのディレクトリを指定する必要があります。
複数のディレクトリを検索
$ローカル/tmpを検索-name mydir -type d -print
これは、現在の作業ディレクトリのローカルサブディレクトリ ツリーと/tmpディレクトリ ツリーで、 mydirという名前のディレクトリを検索します。
エラーを無視する
これを root 以外のユーザーとして実行している場合は、権限拒否 (およびその他の) エラーを無視することをお勧めします。エラーはstderrに出力されるため、出力を /dev/null にリダイレクトすることで抑制できます。次の例は、bash シェルでこれを行う方法を示しています。
$ find / -name myfile -type f -print 2 > /dev/null
cshまたはtcshユーザーの場合、stdoutもリダイレクトせずにstderrをリダイレクトすることはできません。これを回避するには、
sh を使用してコマンドを実行します。find
$ sh -c "find / -name myfile -type f -print 2> /dev/null"
cshまたはtcsh を使用する場合の別の方法は、 stdoutとstderrからの出力をgrepコマンドにパイプすることです。この例は、権限拒否エラーを含む行を抑制する方法を示しています。
$ find . -name myfile |& grep -v '権限が拒否されました'
異なる名前のファイルのいずれかを検索する
$検索 . \( -name '*jsp' -o -name '*java' \) -type f -ls
演算子-lsは拡張情報を出力し、例では、名前が 'jsp' または 'java' で終わる通常のファイルを検索します。括弧が必要であることに注意してください。多くのシェルでは、括弧が特殊なシェル文字として解釈されるのを防ぐために、括弧をバックスラッシュ (\(および) でエスケープする必要があります。演算子は、 のすべてのバージョンで使用できるわけではありません。
\)-lsfind
アクションを実行する
$ find /var/ftp/mp3 -name '*.mp3' -type f -exec chmod 644 {} \;
このコマンドは、ディレクトリ ツリー/var/ftp/mp3内の、名前が.mp3で終わるすべての通常ファイルの権限を変更します。アクションは、コマンドでステートメントを指定することによって実行されます。名前が で終わる通常ファイルごとに、 をファイル名に置き換えてコマンドが実行されます。セミコロン (シェルがコマンド区切り文字として解釈するのを避けるためにバックスラッシュが付けられています) は、コマンドの終了を示します。権限 は通常 と表示され、ファイル所有者にファイルの完全な読み取りおよび書き込み権限を与えますが、他のユーザーには読み取り専用アクセス権が与えられます。シェルによっては、を引用符で囲む必要があります。末尾の " " は、通常、先頭の " " で引用符で囲みますが、一重引用符で囲むこともできます。
-exec chmod 644 {} \;.mp3chmod 644 {}{}644rw-r--r--{};\
コマンド自体は引用符で囲まないでください。そうしないと、次のようなエラーメッセージが表示されます。
検索: echo "mv ./3bfn rel071204": そのようなファイルまたはディレクトリはありません
これは、find' ' というファイルを実行しようとして失敗したことを意味します。
echo "mv ./3bfn rel071204"
多数の結果を実行する場合は、ファイル名をARG_MAXまで収集し、ファイル名のリストを使用して COMMAND を実行する exec プライマリのバリアントを使用する方が効率的です。
$ find . -exec コマンド{} +
COMMANDこれにより、空白を含むファイル名がシェルによって分割されることなく
実行ファイルに渡されるようになります。
ファイルとディレクトリを削除する
アクション-deleteは GNU 拡張機能であり、これを使用すると がオンになります。したがって、実行する前に何が起こるかを把握するためにの代わりに-depthを使用して find コマンドをテストする場合は、 を使用する必要があります。
-print-delete-depth -print
空のファイルを削除し、名前を出力します (これは-emptyGNU のベンダー固有の拡張機能でありfind、すべての実装で使用できるわけではないことに注意してくださいfind)。
$検索 . -空 - 削除 -印刷
空の通常ファイルを削除します:
$検索 . -type f -empty -delete
空のディレクトリを削除します:
$検索 . -type d -empty -delete
「bad」という名前の空のファイルを削除します:
$検索 . -名前 が間違っています -空です -削除
警告。— このアクションは、または など-deleteの条件で使用する必要があります。
-empty-name
$ find . -delete # はすべて削除されます。
文字列を検索する
このコマンドは、/tmp ディレクトリ ツリーのすべてのファイルで文字列を検索します。
$ find /tmp -type f -exec grep '検索文字列' /dev/null '{}' \+
引数/dev/nullは、見つかったテキストの前にファイル名を表示するために使用されます。引数がない場合、見つかったテキストのみが印刷されます。(または、grep の一部のバージョンでは、ファイル名を強制的に印刷する-Hフラグがサポートされています。) GNUを単独で使用してこのタスクを実行することもできます。
grep
$ grep -r '検索文字列' /tmp
jsmith のホーム ディレクトリ ツリーで「LOG」を検索する例:
$ find ~jsmith -exec grep LOG '{}' /dev/null \; -print
/home/jsmith/scripts/errpt.sh:cp $LOG $FIXEDLOGNAME /home/jsmith/scripts/errpt.sh:cat $LOG /home/jsmith/scripts/title:USER=$LOGNAME
現在の作業ディレクトリ ツリー内のすべての XML ファイルで文字列「ERROR」を検索する例:
$ find . -name "*.xml" -exec grep "ERROR" /dev/null '{}' \+
この例では、検索文字列を囲む二重引用符 (" ") と中括弧を囲む一重引用符 (' ') はオプションですが、文字列内にスペースやその他の特殊文字を含めるためには必要です。より複雑なテキストの場合 (特に、`sh` および `csh` から派生した最も一般的なシェルの場合)、二重引用符ではすべての特殊解釈を防止できないため、一重引用符の方が簡単な選択となることが多いことに注意してください。英語の短縮形を含むファイル名を引用すると、これがかなり複雑になることがわかります。アポストロフィを含む文字列は二重引用符で保護する方が簡単なためです。
$ find . -name "含まれているファイル" -exec grep "できない" '{}' \; -print
ユーザーが所有するすべてのファイルを検索する
$ find . -user <ユーザーID>
大文字と小文字を区別しないモードで検索
-inameは標準ではない
ため、すべての実装でサポートされるわけではないことに注意してください。
$ find . -iname 'MyFile*'
-inameスイッチがシステムでサポートされていない
場合は、次のような回避策が考えられます。
$ find . -name '[mM][yY][fF][iI][lL][eE]*'
サイズでファイルを検索する
サイズが 100 キロバイトから 500 キロバイトまでのファイルの検索:
$検索 . -サイズ +100k -a - サイズ -500k
空のファイルの検索:
$検索 . -size 0k
空でないファイルの検索:
$検索 . ! -size 0k
名前とサイズでファイルを検索する
$ /usr/srcを検索します 。\( -name '*,v' -o -name '.*,v' \) '{}' \; -print
このコマンドは、/usr/src ディレクトリ ツリーを検索します。 '*,v'および'.*,v'形式のファイルはすべて除外されます。マウスオーバー時に表示される ツールチップに、注意すべき重要な引数が表示されます。
$( find /opt \( -name error_log -o -name 'access_log' -o -name 'ssl_engine_log' -o -name 'rewrite_log' -o -name 'catalina.out' \) -size +300000k -a -size -5000000k )の ファイルに対して、 cat /dev/null > $fileを実行します。
単位は[bckw]のいずれかで、'b' は 512 バイトのブロック、'c' はバイト、'k' はキロバイト、'w' は 2 バイトのワードを意味します。サイズには間接ブロックはカウントされませんが、実際に割り当てられていないスパース ファイル内のブロックはカウントされます。
時間によるファイル検索
日付範囲は、たとえば、バックアップ以降に変更されたファイルを一覧表示するために使用できます。
-mtime: 変更時刻-ctime: inode 変更時刻-atime: アクセス時間
相対的な日数前に変更されたファイル:
- +[数値] = 少なくともこの日数前。
- -[数値] = 何日前より前。
- [数字] = ちょうどこの日数前。
- オプションで、
-daystart過去 24 時間ではなく、1 日の初め (0 時) からの時間を測定するために追加します。
1 週間 (つまり 7 日間) 以降に変更されたドキュメント フォルダー内のすべてのテキスト ファイルを検索する例:
$ find ~/Documents/ -iname "*.txt" -mtime -7
絶対日時の前または後に変更されたファイル:
-newermt YYYY-MM-DD: 最終更新日以降-not -newermt YYYY-MM-DD: 最終更新日
2017 年 2 月に最後に編集されたすべてのテキスト ファイルを検索する例:
$ find ~/Documents/ -iname "*.txt" -newermt 2017 -02-01 -not -newermt 2017 -03-01
-newer [file]: 指定されたファイルよりも最近変更されました。-cnewer: inode 変更時間と同様です。-anewer: アクセス時間も同様です。-not逆の結果や範囲を求める場合は、 を先頭に追加することもできます。
「document.txt」より最近編集されたすべてのテキスト ファイルを一覧表示します。
$ find ~/Documents/ -iname "*.txt" -新しいdocument.txt
関連ユーティリティ
locateは、ファイルシステムのディレクトリツリーではなく、事前に構築されたファイルのデータベースを検索する Unix 検索ツールです。これは よりも高速ですがfind、データベースが最新でない可能性があるため、精度は低くなります。grepは、プレーンテキスト データ セット内で正規表現に一致する行を検索し、デフォルトで一致する行を標準出力に報告するコマンド ライン ユーティリティです。treeは、ディレクトリ ツリー内で見つかったファイルを再帰的に一覧表示し、ファイル階層内の位置に応じてファイル名をインデントするコマンド ライン ユーティリティです。- GNU Find Utilities (findutils とも呼ばれます) は、ツールとの実装を含むGNU パッケージです。
findxargs - BusyBox は、リソースが非常に限られている組み込みオペレーティング システム向けに、いくつかの簡素化された Unix ツールを 1 つの実行可能ファイルにまとめたユーティリティです。また、 のバージョンも提供しています
find。 dirファイルまたはディレクトリを再帰的に検索する /s オプションがあります。- ベル研究所の Plan 9 は、を置き換えるために 2 つのユーティリティを使用しています
find。walkはツリーをたどって名前を出力するだけであり、sorはシェル スクリプトの形式で式を評価することによってフィルタリング (grep など) のみを行います。パイプ経由で任意のフィルタを使用できます。 コマンドはUser Space の Plan 9の一部ではないため、Google の Benjamin Barenblat が POSIX システムに移植したバージョンを GitHub で公開しています。[9] fdはRustプログラミング言語findで書かれたシンプルな代替手段です。[10]
参照
- mdfind は、 macOSとDarwinのメタデータを利用する同様のユーティリティです。
- Unixコマンドのリスト
- DOSコマンドのリスト
- フィルタ(高階関数)
- find (Windows) は、Unixとはまったく異なるDOSおよびWindowsコマンドです。
find - forfiles は、Unixに似た、属性でファイルを検索するWindowsコマンドです。
find - grep は、Windowsに似たパターンに一致するテキストを検索するUnixコマンドです。
find
参考文献
- ^ 「find(1) – Linuxマニュアルページ」。man7.org 。2019年11月19日閲覧。
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. Bell Labs. 139.
- ^ "libarchive/libarchive". GitHub . 2015年10月4日閲覧。
- ^ ファイルの検索
- ^ 「IBM System i バージョン 7.2 プログラミング Qshell」(PDF) . IBM . 2020 年 9 月 5 日閲覧。
- ^ ab : ファイルの検索 – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- ^ – FreeBSD一般コマンドマニュアル
- ^ – Linuxユーザーマニュアル– ユーザーコマンド
- ^ 「google / walk: find ( 1) に代わる Plan 9 スタイルのユーティリティ」。GitHub。2020年3 月 30 日閲覧。
- ^ Peter, David (2020年3月30日). 「sharkdp/fd: 'find' に代わるシンプルで高速かつユーザーフレンドリーな代替手段」. GitHub .
外部リンク
- GNU findの公式ウェブページ
- コマンド find – 25 の実用的な例
