LinuxとUnixコマンドの使用:find

LinuxおよびUnixコマンドfindは、ディレクトリ階層内のファイルの検索を実行します。

findコマンドの構文:

find [パス...] [式]

説明

このマニュアルページにはGNU版のfindが書かれています 。 コマンドfindは、指定された式を左から右に評価することによって、各ファイル名に根ざしたディレクトリツリー検索します。 言い換えれば、左側がfalseで操作がtrue、 または trueの場合findが次のファイル名に移動します。

次で始まる最初の引数:

表現の始まりとみなされます。 その前にある引数は検索のパスになり、その後の引数は残りの式になります。 パスが指定されない場合、現在のディレクトリが使用されます。 式が指定されていない場合、式-printが使用されます。

findコマンドは、すべてのファイルが正常に処理された場合はステータス0で終了し、エラーが発生した場合は0より大きい値で終了します。

式は、オプション(特定のファイルの処理ではなく全体の動作に影響を与え、常にtrueを返す)、テスト(真または偽の値を返す)、およびアクション(副作用があり、真または偽の値)はすべて演算子で区切られています。 演算子が省略されている場合、 -andは仮定されます。 式に-prune以外のアクションが含まれていない場合は、式が真であるすべてのファイルに対して-printが実行されます。

オプション

すべてのオプションは常にtrueを返します。 それらは、式の中の場所に達したときにのみ処理されるのではなく、常に有効になります。 したがって、わかりやすくするために、式の先頭に配置することをお勧めします。

-daystart 24時間前からではなく、今日の初めからの時間( -amin、-atime、-cmin、-ctime、-mmin、および-mtime )を測定します。
深さ 各ディレクトリの内容をディレクトリ自体の前で処理します。
-follow シンボリックリンクを参照解除する。 - ノアラフを暗示する
-helpまたは--help findとexitのコマンドライン使用法の要約を表示します。
-maxdepth [数値] コマンドライン引数以下のディレクトリのレベル数(負でない整数)を降順で指定します。 式-maxdepth 0は、コマンド行引数にのみテストとアクションを適用することを意味します。
-mindepth [number] 数値より少ないレベル(負でない整数)でテストやアクションを適用しないでください。 式-mindepth 1は、コマンドライン引数以外のすべてのファイルを処理することを意味します。
-マウント 他のファイルシステムのディレクトリを降下させないでください。 findの他のバージョンとの互換性のために、 -xdevの代替名。
- ノレアフ ディレクトリにハードリンク数より2つ少ないサブディレクトリがあると仮定して最適化しないでください。*
-versionまたは--version 見つかったバージョン番号を印刷して終了します。
-xdev 他のファイルシステムのディレクトリを降下させないでください。

*このオプションは、CD-ROMやMS-DOSファイルシステムやAFSボリュームマウントポイントなどUnixのディレクトリリンク規則に従わないファイルシステムを検索する場合に必要です。 通常のUnixファイルシステムの各ディレクトリには、少なくとも2つのハードリンクがあります (期間)エントリ。 さらに、そのサブディレクトリ(存在する場合)はそれぞれ、そのディレクトリにリンクされた..エントリを持っています

findがディレクトリを調べているときに、ディレクトリのリンク数よりも2つ少ないサブディレクトリがあると、ディレクトリ内の残りのエントリはディレクトリ以外(ディレクトリツリー内のリーフファイル)であることがわかります。 ファイルの名前だけを調べる必要がある場合は、それらの名前を統計する必要はありません。 検索速度が大幅に向上します。

テスト

数値引数は次のように指定できます。

+ n nより大きい
-n n未満です
n 正確にはn。
- アミノ ファイルは最後にn分前にアクセスされました。
-anewer [ファイル] ファイルが最後にアクセスされたのは、 ファイルが変更された直前です 。 -anewerは、-followがコマンドラインで-anewerの前に来る場合にのみ、-followの影響を受けます。
- 時刻n ファイルは最後にn * 24時間前にアクセスされました。
-cmin n ファイルのステータスはn分前に最後に変更されました。
-cnewer [ファイル] ファイルのステータスは、ファイルが変更された直前に最後に変更されました。
- cnewerは、コマンドラインで-followが-cnewerの前に来た場合にのみ、 -followの影響を受けます。
-ctime n ファイルの状態は24時間前に最後に変更されました。
-空の ファイルは空で、通常のファイルまたはディレクトリのいずれかです。
-false 常に偽です。
-fstype [タイプ] ファイルは指定されたタイプのファイルシステム上にあります。 有効なファイルシステムの種類はUnixのバージョンによって異なります。 Unixやその他のバージョンで受け入れられるファイルシステムタイプの不完全なリストは、ufs、4.2,4.3、nfs、tmp、mfs、S51K、S52Kです。 あなたのファイルシステムのタイプを見るには、%Fディレクティブで-printfを使うことができます。
-gid n ファイルの数値グループIDはnです。
-group [gname] ファイルはグループgname(許可された数値のグループID)に属します。
-ilname [パターン] -lnameと似ていますが、大文字と小文字は区別されません。
-iname [パターン] -nameと同様ですが、大文字と小文字は区別されません。 例えば、 fo *及びF? FooFOOfoofOoなどのファイル名と一致する
-num ファイルにはiノード番号nがあります。
-ipath [パターン] like -pathですが、大文字と小文字は区別されません。
-iregex [パターン] -regexと似ていますが、大文字と小文字は区別されません。
-links n ファイルにはn個のリンクがあります。
-lname [パターン] ファイルはシェルパターンと一致する内容のシンボリックリンクです。 メタキャラクタは/または処理しません 特別に。
-mmin n ファイルのデータはn分前に最後に変更されました。
-mtime n ファイルのデータは24時間前に最後に変更されました。
-name [パターン] ファイル名のベース(先頭のディレクトリが削除されたパス)は、シェルのパターンと一致します。 メタキャラクタ( *[] )はaには一致しません ベース名の先頭に。 ディレクトリとその下のファイルを無視するには、 -pruneを使用します-pathの説明の例を参照してください。
-newer [ファイル] ファイルはファイルよりも最近変更されました。 式-newerは、 -followがコマンドラインで-newerの前に来た場合にのみ、 -followの影響を受けます。
- 奴 ファイルの数値ユーザーIDに対応するユーザーはありません。
- グループ ファイルの数値グループIDに対応するグループはありません。
-path [パターン] ファイル名はシェルパターンパターンと一致します。 メタキャラクタは/または処理しません 特に; そう、例えば、見つける。 -path './sr*scは、./src/miscというディレクトリ(存在する場合)のエントリを表示します。 ディレクトリツリー全体を無視するには、ツリー内のすべてのファイルをチェックするのではなく、 -pruneを使用します。 たとえば、ディレクトリsrc / emacsとその下のすべてのファイルとディレクトリをスキップし、見つかった他のファイルの名前を表示するには、find:findのようにします。 -path './src/emacs' -prune -o -print
-perm [mode] ファイルのパーミッションビットは、正確には[モード] (8進またはシンボリック)です。 シンボリックモードはモード0を出発点として使用します。
-perm -mode すべての許可ビット[mode]がファイルに設定されます。
-perm + mode すべての許可ビット[mode]がファイルに設定されます。
-regex [パターン] ファイル名は正規表現パターンと一致します 。 これは検索ではなくパス全体で一致します。 たとえば、./fubar3という名前のファイルと一致させるには、正規表現。*バーを使用できます。 または*。b。* 3b。* r3ではありません。
-size n [bckw] ファイルはn単位のスペースを使用します。 単位はデフォルトで512バイトのブロック、またはbがnの後に続く場合はc、 nが続く場合はバイト、 nが kの後の場合はキロバイト、wがnに続く場合は2バイトのワードです。 サイズは間接ブロックをカウントしませんが、実際には割り当てられていないスパースファイルのブロック数をカウントします。
常に真実。
タイプC ファイルはタイプc
b 特別なブロック(バッファリング)
c キャラクター(バッファーなし)スペシャル
d ディレクトリ
p 名前付きパイプ(FIFO)
f 通常のファイル
l シンボリックリンク
s ソケット
D ドア(Solaris)
-uid n ファイルの数値ユーザーIDはnです。
-used n 状態が最後に変更されてからn日後にファイルに最後にアクセスされました。
-user uname ファイルはユーザーuname (数値のユーザーIDが許可されています)が所有しています。
-xtype c ファイルがシンボリックリンクでない場合は、 -typeと同じです。 シンボリックリンクの場合: -followが指定されていない場合、ファイルがタイプcのファイルへのリンクである場合はtrue、 -followが与えられているならば、 cがlなら真。 言い換えると、シンボリックリンクの場合、
-xtypeは、 -typeがチェックしないファイルのタイプをチェックします。

行動

-exec コマンド

コマンドを実行します。 ステータスが0の場合はtrue。 findに続くすべての引数は、 `; 'で構成される引数までコマンドの引数とみなされます。 遭遇する。 文字列 `{} 'は、現在のファイル名で置き換えられます。これは、 findのいくつかのバージョンのように、引数が単独である場合だけでなく、コマンドの引数で発生するすべての場所で処理されます 。 シェルによる拡張からシェルを保護するためには、これらの構造の両方をエスケープ( `\ ')するか、引用符で囲む必要があるかもしれません。 コマンドは開始ディレクトリで実行されます。

-fls ファイル

真; -lsと似ていますが 、-fprintのようなファイルに書き込みます

-fprint ファイル

真; 完全なファイル名をファイルfileに出力しますfindが実行されたときにファイルが存在しない場合、 ファイルが作成されます。 それが存在する場合、切り捨てられます。 ファイル名 `` / dev / stdout ''と `` / dev / stderr ''は特別に扱われます。 標準出力と標準エラー出力をそれぞれ参照します。

-fprint0 ファイル

真; -print0と同じですが、-fprintのようなファイルに書き込みます

-fprintf ファイル 形式

真; -printfと同じですが、-fprintのようなファイルに書き込みます

-ok コマンド

-execと似ていますが、ユーザーに最初に(標準入力で)尋ねます。 応答が `y 'または` Y'で始まらない場合は、コマンドを実行せずにfalseを返します。

-print

真; 完全なファイル名を標準出力に出力し、その後に改行を続けます。

-print0

真; 完全なファイル名を標準出力に出力し、その後にヌル文字を続けて出力します。 これにより、改行を含むファイル名がfind出力を処理するプログラムによって正しく解釈されるようになります。

-printf 形式

真; `\ 'エスケープと`%'指示文を解釈して、標準出力に出力します。 フィールドの幅と精度は `printf 'C関数で指定することができます。 -printとは異なり、-printfは文字列の最後に改行を追加しません。 エスケープとディレクティブは次のとおりです。

\ a

アラームベル。

\ b

バックスペース。

\ c

このフォーマットからの印刷を直ちに停止し、出力をフラッシュしてください。

\ f

フォームフィード。

\ n

改行

\ r

キャリッジリターン。

\ t

水平タブ。

\ v

垂直タブ。

\\

リテラルのバックスラッシュ( `\ ')。

\ NNN

ASCIIコードがNNN(8進数)の文字。

`\ '文字とそれに続く他の文字は、通常の文字として扱われるので、両方とも出力されます。

%%

リテラルのパーセント記号。

%a

ファイルの最後のアクセス時間は `ctime '関数によって返された形式で返されます。

%A k

ファイルの最後のアクセス時刻は、 `@ 'またはCの` strftime'関数のディレクティブのいずれかであるkで指定された形式です。 kの可能な値は以下の通りです。 システム間の `strftime 'の違いのため、それらのいくつかはすべてのシステムで利用できないかもしれません。

@

1970年1月1日00:00 GMTからの秒数。

時間フィールド:

H

時間(00.23)

時(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)

バツ

ロケールの時間表現(H:M:S)

Z

タイムゾーン(例えば、EDT)、またはタイムゾーンが特定できない場合は何もしない

日付フィールド:

a

ロケールの短縮曜日名(Sun..Sat)

A

ロケールの完全な曜日名、可変長(日曜日、土曜日)

b

ロケールの短縮月名(Jan..Dec)

B

ロケールのフル月名、可変長(January ... Dec.)

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)としての月の週番号

バツ

ロケールの日付表現(mm / dd / yy)

y

年の最後の2桁(00..99)

Y

年(1970年...)

%b

ファイルのサイズは512バイトブロック(切り上げ)。

%c

ファイルの最後の状態変更時刻は `ctime '関数によって返された形式になります。

%C k

ファイルの最後のステータス変更時刻は、%Aと同じkで指定された形式です。

%d

ディレクトリツリー内のファイルの深さ。 0はファイルがコマンドライン引数であることを意味します。

%f

先頭のディレクトリが削除されたファイルの名前(最後の要素のみ)。

%F

ファイルが存在するファイルシステムのタイプ。 この値は-fstypeに使用できます。

%g

ファイルのグループ名、またはグループに名前がない場合は数値のグループID。

%G

ファイルの数値グループID。

%h

ファイル名の先頭のディレクトリ(最後の要素を除く)。

%H

ファイルが見つかったコマンドライン引数。

%私

ファイルのinode番号(10進数)。

%k

ファイルのサイズは1Kブロック(切り上げ)です。

%l

シンボリックリンクのオブジェクト(ファイルがシンボリックリンクでない場合は空文字列)。

%m

ファイルのパーミッションビット(8進数)。

%n

ファイルへのハードリンクの数。

%p

ファイルの名前。

%P

削除されたコマンドライン引数の名前を含むファイルの名前。

%s

ファイルのサイズ(バイト)。

%t

Cの `ctime '関数が返す形式のファイルの最終更新時刻。

%T k

ファイルの最終変更時刻は、%Aと同じkで指定された形式で表されます。

%u

ユーザーの名前がない場合は、ファイルのユーザー名または数値のユーザーID。

%U

ファイルの数値ユーザーID。

`% '文字とそれに続く他の文字は破棄されますが、他の文字は印刷されます。

-プルーン

-depthが指定されていない場合はtrueです。 現在のディレクトリを降下しないでください。
-depthが指定されている場合はfalseです。 無効。

-ls

真; 現在のファイルを `ls -dils '形式で標準出力に表示します。 環境変数POSIXLY_CORRECTが設定されていない限り、ブロック数は1Kブロックです。この場合、512バイトのブロックが使用されます。

演算子

優先順位の低い順にリストされます:

expr

優先順位を強制する。

expr

exprがfalseの場合はtrue。

-not expr

と同じ ! expr

expr1 expr2

そして(暗に); expr1がfalseの場合、 expr2は評価されません。

expr1 -a expr2

expr1 expr2と同じです。

expr1expr2

expr1 expr2と同じです。

expr1 -o expr2

または、 expr1がtrueの場合、 expr2は評価されません。

expr1またはexpr2

expr1 -o expr2と同じです。

expr1expr2

リスト; expr1expr2の両方が常に評価されます。 expr1の値は破棄されます。 リストの値はexpr2の値です。

find / home -user joe

ユーザーjoeが所有する/ homeディレクトリ下のすべてのファイルを検索します。

find / usr -name * stat

/ usrディレクトリの下にあるすべてのファイルを ".stat"で終わるものを探します。

/ var / spool -mtime +60を見つける

60日以上前に変更された/ var / spoolディレクトリ下のすべてのファイルを検索します。

find / tmp -nameコアタイプf -print | xargs / bin / rm -f

/ tmpディレクトリ以下のcoreという名前のファイルを検索して削除します。 改行、一重引用符または二重引用符、またはスペースを含むファイル名がある場合、これは間違って動作することに注意してください。

/ tmp -nameコアタイプを見つけます。 xargs -0 / bin / rm -f

一重引用符、二重引用符、スペースまたは改行を含むファイル名またはディレクトリ名が正しく処理されるようにファイル名を処理し、 / tmpディレクトリ以下のcoreという名前のファイルを検索して削除します。 -nameテストは、すべてのファイルに対してstat(2)を呼び出さなくて済むように、 -typeテストの前にあります。

見つける。 -t f -execファイル '{}' \;

現在のディレクトリ以下のすべてのファイルに対して `file 'を実行します。 中括弧はシェルスクリプトの句読点として解釈されないように、一重引用符で囲まれています。 セミコロンも同様にバックスラッシュの使用によって保護されますが、 ';' その場合にも使用されている可能性があります。

\ - (-perm -4000 -fprintf /root/suid.txt '%#m%u%p \ n' \)、\ \(-size + 100M -fprintf /root/big.txt '%-10s% p \ n '\)

setuidファイルとディレクトリを/root/suid.txtに 、大きいファイルを/root/big.txtにリストアップするだけで、ファイルシステムを一度走査してください

$ HOME -mtimeを見つける0

最後の24時間以内に変更されたホームディレクトリ内のファイルを検索します。 このコマンドは、各ファイルが最後に変更されてからの経過時間を24時間で除算し、余りが破棄されるため、このように動作します。 これは、 -mtimeと一致することを意味します

0の場合、ファイルは過去24時間以内に修正されている必要があります。

見つける。 パーペム664

所有者とグループに対して読み取りと書き込みの許可を持っているが、ほかのユーザーは読み取りも書き込みもできないファイルを検索します。 これらの基準を満たしていて他の権限ビットが設定されているファイル(たとえば、誰かがファイルを実行できる場合など)は一致しません。

見つける。 -perm -664

余分なパーミッションビット(例えば、実行可能ビット)の存在に関係なく、所有者とグループ、および他のユーザーが読み取ることができる読み取りおよび書き込み許可を持つファイルを検索します。 たとえば、モード0777のファイルと一致します。

見つける。 パーミル/ 222

誰か(その所有者、そのグループ、または誰か)が書き込み可能なファイルを検索します。

見つける。 -perm / 220 find。 -perm / u + w、g + wを 見つける。 -perm / u = w、g = w

これら3つのコマンドはすべて同じことを行いますが、最初のコマンドはファイルモードの8進表現を使用し、残りの2つはシンボリック形式を使用します。 これらのコマンドはすべて、所有者またはそのグループのいずれかが書き込み可能なファイルを検索します。 ファイルは、一致する所有者とグループの両方によって書き込み可能である必要はありません。 いずれかを行います。

見つける。 -perm -220 find。 -perm -g + w、u + w

これらのコマンドはどちらも同じことを行います。 所有者とそのグループの両方が書き込み可能なファイルを検索します。

見つける。 -perm-444 -perm / 222! -perm / 111 find。 -perm -a + r -perm / a + w! -perm / a + x

これらの2つのコマンドは、すべてのユーザーが読み取り可能なファイル(-perm -444または-perm -a + r)を検索し、少なくとも書き込みビットが設定されている(-perm / 222または-perm / a + w)誰か(!-perm / 111と!-perm / a + xそれぞれ)

重要: manコマンド( %man )を使用して、特定のコンピュータでコマンドがどのように使用されているかを確認してください。