概要
場合によっては、システム内で特定の特性 (ファイルのアクセス許可、ファイルの所有者、ファイルの長さ、ファイルの種類など) を持つファイルを検索する必要がある場合があります。これには多くの理由が考えられます。おそらく、セキュリティ上の理由、または一般的なシステム管理タスク、または単にどこかに保存されているファイルを見つけるためである可能性があります。 find は、現在のディレクトリまたはファイル システム全体を走査して、特定のファイルまたはディレクトリを見つけることができる非常に効果的なツールです。
find には非常に強力な機能があるため、多くのオプションもあり、そのほとんどは時間をかけて理解する価値があります。システムにネットワーク ファイル システム (NFS) が含まれている場合でも、対応するアクセス許可を持っている限り、find コマンドはファイル システムでも有効です。
非常にリソースを消費する find コマンドを実行する場合、大規模なファイル システム (ここでは 30G バイトを超えるファイル システムを指します) の走査に時間がかかる可能性があるため、多くの人はバックグラウンドで実行する傾向があります。コマンド
パス名を検索 -オプション [-print -exec -ok]
find コマンドの一般的な形式は次のとおりです:
find [-H] [-L] [-P] [path...] [expression]
その中で、3 つの主要なオプションは '-H' '-L' です'-P' シンボリック リンクを処理するために使用されます。 '-H' はコマンド ラインで指定されたシンボリック リンクのみをたどることを意味し、'-P' はすべてのシンボリック リンクをたどることを意味します。シンボリックリンクをたどらないことを意味します。
たとえば、現在のディレクトリにシンボリック リンク e1000 があり、ファイル名の最後の文字が数字であるソース ファイルを見つけたいとします。次に、
$ find -H . -name "*[0-9] とします。 ].c" -print
./2234.c
上記のように書くとカレントディレクトリにある要件を満たすファイルだけが見つかりますが、e1000以下のファイルは見つかりません。したがって、次のように書くことができます:
$ find -H e1000 . -name "*[0-9].c" -print
または '-L' オプションを使用します
$ find -L . -name "*[0-9] . c" -print
形式の [path...] 部分は、このディレクトリが検索するルート ディレクトリとして使用されることを示します。
形式内の[式]は式です。最も基本的な式は、設定項目 (オプション)、テスト項目 (テスト)、およびアクション項目 (アクション) の 3 つのカテゴリに分類され、論理演算子 (演算子) を使用して結合して、より大きく複雑な式を作成できます。モード。設定項目 (- Depth、-max Depth など) は、特定のファイルだけでなく、この検索タスクに固有のものであり、テスト項目 (test) は異なります。 -name、-num、-user などの特定のファイルは、true または false を返します。アクション項目 (action) は、特定のファイルに対して何らかのアクション (-print などの最も一般的なもの) を実行し、true または false を返します。
find を非常に強力なものにしているのは、[式] 部分の豊かさです。この部分はさらに複雑なので、後で説明します。
find コマンド オプション
find コマンドには多くのオプションまたは式があり、各オプションの前にはダッシュ - が付きます。まずこのコマンドの主なオプションを見てから、いくつかの例を示します。
-name ファイル名でファイルを検索します。
-perm ファイル権限に基づいてファイルを検索します。
-prune このオプションを使用して、現在指定されているディレクトリ内で find コマンドが検索しないようにします。 - Depth オプションも使用されている場合、-prune オプションは find コマンドによって無視されます。
-user 所有者に従ってファイルを検索します。
-group 所属するグループに従ってファイルを検索します。
-mtime -n または +n は、変更時刻に基づいてファイルを検索します。 -n はファイルが今から n 日以内に変更されたことを示し、+n はファイルが n 日前から変更されたことを示します。 find コマンドには -atime オプションと -ctime オプションもありますが、これらは -mtime オプションに似ているため、ここでは -mtime オプションのみを紹介します。
-nogroup ファイルが属する有効なグループがないファイル、つまり、ファイルが属するグループが /etc/groups に存在しないファイルを検索します。
-nouser 有効な所有者のないファイルを検索します。つまり、ファイルの所有者が /etc/password に存在しません。
-newer file1 ! file2 変更時刻が file1 より新しく、file2 より古いファイルを検索します。
-type 次のような特定のタイプのファイルを検索します。
b - ブロック デバイス ファイル。
d - ディレクトリ。
c - キャラクターデバイスファイル。
p - パイプファイル。
l - シンボリックリンクファイル。
f - 通常のファイル。
-size n[c] ファイル長が n ブロックのファイルを検索します。c が含まれる場合、ファイル長はバイト単位で測定されます。
- Depth ファイルを検索するときは、まず現在のディレクトリでファイルを検索し、次にそのサブディレクトリでファイルを検索します。
-fstype 特定の種類のファイル システムにあるファイルを検索します。これらのファイル システム タイプは通常、設定ファイル /etc/fstab にあります。この設定ファイルには、このシステムのファイル システムに関する情報が含まれています。
-mount は、ファイルを検索するときにファイル システムのマウント ポイントを越えません。
-follow find コマンドでシンボリック リンク ファイルが見つかった場合、そのリンクが指すファイルをたどります。
-cpio 一致するファイルに対して cpio コマンドを使用して、これらのファイルをテープ デバイスにバックアップします。
名前オプションを使用する
ファイル名オプションは、find コマンドで最もよく使用されるオプションです。このオプションは、単独で使用することも、他のオプションと組み合わせて使用することもできます。ファイル名パターンを使用してファイルを照合できます。ファイル名パターンを引用符で囲むことを忘れないでください。
現在のパスが何であっても、ルート ディレクトリ $HOME で *.txt に一致するファイル名を持つファイルを検索する場合は、パス名パラメーターとして ~ を使用します。チルダ ~ は $HOME ディレクトリを表します。
$ find ~ -name "*.txt" -print
現在のディレクトリとサブディレクトリ内のすべての「*.txt」ファイルを検索したい場合は、次を使用できます:
$ find -name "*.txt" -print
現在のディレクトリと必要なサブディレクトリで名前が大文字で始まるファイルを検索するには、次のコマンドを使用します:
$ find . -name "[A-Z]*" -print
名前が h o s t で始まるファイルを検索したい場合/etc ディレクトリ内 で始まるファイルの場合:
$ find /etc -name "host*" -print
現在のディレクトリ内で、名前が 2 つの小文字で始まり、その後に 2 つの数字が続き、最後に 3 文字で始まるファイルを検索する場合* . t x t
ファイルの場合、次のコマンドは ax37.txt という名前のファイルを返します:
$ find . -name "[a-z][a-z][0--9][0--9].txt" -print
Use perm オプション
ファイル許可モードに従ってファイルを検索したい場合は、-perm オプションを使用できます。すべてのユーザーが実行権限を持つファイルを検索する必要がある場合や、ユーザーのディレクトリ内のファイル権限タイプを表示する必要がある場合があります。このオプションを使用する場合は、アクセス許可に 8 進表記を使用することをお勧めします。現在のディレクトリ内でファイル許可ビット 7 5 5 を持つファイル、つまり、ファイルの所有者が読み取り、書き込み、実行でき、他のユーザーが読み取りと実行ができるファイルを検索するには、次のコマンドを使用できます:
$ find . -perm 755 -print 論理演算
find の論理演算子には、優先順位が高いものから低いものの順に主に次のものが含まれます:
(expr)
括弧の優先順位が最も高く、最初に括弧内の値を評価します
!
expresses expr 式の値は反転されます
-not expr
上記と同じですが、POSIX は演算子なしの
expr1 expr2
をサポートしません。これは、2 つの間の AND を加算すること、つまり AND 演算と同等です。式は、値全体が true を返す前に true になります。 expr1 式が最初に評価され、それが false の場合、expr2 は評価されません。
expr1 -a expr2
上記と同じ
expr1 -and expr2
上記と同じですが、POSIX はサポートしていません
expr1 -o expr2
は、2 つの式 expr1 と expr2 の値を OR することを意味します。左右の値のいずれかが true の場合、式全体が true になります。 expr1 式が最初に評価され、それが true の場合、expr2 は評価されません。
expr1 -or expr2
上記と同じですが、POSIX は
expr1、expr2
カンマ式をサポートしていません。 expr1 と expr2 の両方が評価されますが、expr2 の値のみが返されます。 expr1 の値は破棄されます
prune オプションを使用してください
。-prune はアクション項目です。これは、ファイルがディレクトリ ファイルである場合、検索のためにこのディレクトリに入らないことを意味します。 -prune アクションを理解するには、まず find コマンドの検索ルール (find コマンドのアルゴリズムとも言えます) を理解する必要があります。
find コマンドは、指定されたディレクトリ ツリーを再帰的に走査し、ファイルごとに find コマンドの式を順番に実行します。式は最初に論理演算子に従って結合され、次に式が左から右に評価されます。以下のコードを例に説明します
find PATHP1 OPT1 TEST1 ACT1 (TEST2 または TEST3) ACT2
1 OPT1 設定項目に従って find コマンド全体の設定を行います。 - Depth 設定項目がない場合は、
2. コマンドファイル変数 File = PATHP1
3. ファイルファイルに対して TEST1 テストを実行します。実行結果が false の場合は、(8) に進みます。
4. ファイルファイルに対して ACT1 アクションを実行します。結果が false の場合は、(8)
5 に進みます。ファイルに対して ACT1 を実行し、実行結果が true の場合は、ファイルに対して TEST3 のテストを実行します。 file. 実行結果が false の場合は、(8)
7. File ファイルに対して ACT2 アクションを実行します。 8. File ファイルがディレクトリであり、-prune アクションが実行されていない場合は、これを入力します。ディレクトリ
9. シーケンスにファイルがあるかどうか、File がそのファイルを指すようにします。
10. カレント ディレクトリが PATHP1 であるかどうかを判断します。そうでない場合は、前のディレクトリに戻って (9) に進みます
上記のプロセスを理解すると、次のコードが '.'
$ find のみを出力する理由を理解するのは難しくありません。次のように、現在のディレクトリには 4090 バイトを超えるファイルが 2 つあり、4096 バイトを超えるファイルは 1 つだけあります。 -size +4090c -print
.
./a_book_of_c. size +4096c -print
./a_book_of_c.chm
それでは、上記の 2 つの -print を -prune に置き換えると、これら 2 つのコマンドは何を出力しますか?
$ find . -size +4090c -prune
.
$ find . -size +4096c -prune
./a_book_of_c.chm
-prune は、特定のディレクトリを避けるためによく使用されます。は:
$ find PATH (-path -o -path ) -prune -o -path
$ find . -size +0c -wholename "*e*[0-9]*" -o ! /( -name "." -o -name "*phone" /) -prune -name "* . c" -user xixi -o -name "*phone"
探しているファイルがそのディレクトリに存在しないことがわかっているため、ファイルを検索するときにそのディレクトリを無視したい場合は、-prune オプションを使用できます。何を無視する必要があるかを示します。 -深さオプションも使用すると、-prune オプションは find コマンドによって無視されるため、-prune オプションを使用するときは注意してください。
/apps/bin ディレクトリではなく /apps ディレクトリ内のファイルを検索したい場合は、次を使用できます:
$ find /apps -name "/apps/bin" -prune -o -print
user および nouser オプションを使用します
ファイル所有者に従ってファイルを検索したい場合は、対応するユーザー名を指定できます。たとえば、所有者が dave であるファイルを $HOME ディレクトリ内で検索するには、次のように使用できます:
$ find ~ -user dave -print
所有者が uucp であるファイルを /etc ディレクトリ内で検索するには:
$ find /etc -user uucp -print
所有者アカウントが削除されたファイルを検索するには、-nouser オプションを使用できます。これにより、所有者が有効なアカウントを持たないファイルを /etc/password ファイル内で検索できるようになります。 -nouser オプションを使用する場合、ユーザー名を指定する必要はありません。find コマンド
が自動的に処理を行います。たとえば、/home ディレクトリでそのようなファイルをすべて検索したい場合は、次のコマンドを使用できます。
$ find /home -nouser -print
group オプションと nogroup オプションを使用します
user オプションと nouser オプションと同様に、ユーザー グループに対しても/apps ディレクトリ内の accts ユーザー グループに属するファイルを検索するには、次のコマンドを使用します。
$ find /apps -group accts -print
該当するすべてのファイルを検索するには、有効なユーザー グループがない場合は、nogroup オプションを使用できます。以下の find コマンドは、ファイル システムのルート ディレクトリからそのようなファイルを検索します
$fine / -nogroup -print
変更時間によってファイルを検索します
変更時間によってファイルを検索したい場合は、mtime オプションを使用できます。システムの空き領域が突然不足した場合は、この期間中に特定のファイルの長さが急速に増大している可能性が高く、この場合、mtime オプションを使用してそのようなファイルを見つけることができます。今から n 日以内に変更されたファイルを制限するにはマイナス記号 - を使用し、n 日前に変更されたファイルを制限するにはプラス記号 + を使用します。
システムのルート ディレクトリで 5 日以内の変更時刻を持つファイルを検索したい場合は、次のコマンドを使用できます:
$ find / -mtime -5 -print
3 日前の変更時刻を持つファイルを /var/ で検索するにはadm ディレクトリでは、以下を使用できます:
$ find /var/adm -mtime +3 -print
新しいオプションを使用する
変更時刻が特定のファイルより新しいが、別のファイルより古いすべてのファイルを検索したい場合は、-newer オプションを使用できます。その一般的な形式は次のとおりです:
最新のファイル名 ! 最古のファイル名
ここで、 !は論理否定記号です。ここに、約 2 日間隔で変更された 2 つのファイルがあります。
以下の find コマンドは、ファイル age.awk よりも新しいが、ファイル Belts.awk より古いファイルを検索できます:
$find ! -newer Belts.awk -exec ls -l {} ;
find コマンドのこのオプションを使用して 2 時間以内に変更されたファイルを検索する場合、変更時刻がたまたま 2 時間前である既存のファイルがない限り、比較するファイルはありません。着替えの時間。この問題を解決するには、まずファイルを作成し、その日付とタイムスタンプを目的の時刻に設定します。これは、タッチ コマンドを使用して実現できます。
現在時刻が 2 3:4 0 で、変更時間が 2 時間以内のファイルを検索したいとします。まず次のようなファイルを作成します:
要件を満たすファイル。ここでは、今日が 5 月 4 日であり、このファイルの変更時刻が 21:40 であると仮定します。これは、現在よりちょうど 2 時間早いです。
find コマンドの -newer オプションを使用して、現在のディレクトリ内で 2 時間以内に変更されたすべてのファイルを検索できます:
$ find . -newer dstamp -print
type オプションを使用します
Unix にはいくつかのタイプがありますまたは Linux システム さまざまなファイル タイプについては、前の章ですでに実行しました。/etc ディレクトリ内のすべてのディレクトリを検索するには、次のコマンドを使用します。ディレクトリ以外のすべての種類のファイルについては、次を使用できます:
$ find ! -type d -print
/etc ディレクトリ内のすべてのシンボリック リンク ファイルを検索するには、次を使用できます:
$ find /etc -type l -print
を使用します。size オプション
を使用すると、ファイルの長さに応じてファイルを検索できます。ここで参照されるファイルの長さは、ブロックまたはバイト単位で測定できます。バイト単位で測定されるファイル長の表現形式は N c であり、ブロック単位で測定されるファイル長は数値でのみ表現できます。個人的に私は常にバイトを使用しており、ファイル長でファイルを検索する場合、ブロックを使用した方が変換が簡単であるため、ファイル システムのサイズを調べている場合を除き、ほとんどの人はブロック数ではなくこのファイル長をバイト単位で使用することを好みます。
現在のディレクトリでファイル長が 1 M バイトを超えるファイルを検索するには、次を使用できます:
$ find . -size +1000000c -print
/home/ でちょうど 1 0 0 バイトの長さのファイルを検索するにはapache ディレクトリ ファイルの場合は、次を使用できます:
$ find /home/apache -size 100c -print
現在のディレクトリ内で 10 ブロック (1 ブロックは 5 1 2 バイトに等しい) を超えるファイルを検索するには、次を使用できます:
$ find . -size +10 -print
Depth オプションを使用します
find コマンドを使用するときは、最初にすべてのファイルを照合してから、サブディレクトリを検索することをお勧めします。 Depth オプションを使用すると、find コマンドでこれを行うことができます。その理由の 1 つは、find コマンドを使用してファイル システムをテープにバックアップするときに、最初にすべてのファイルをバックアップしてから、サブディレクトリ内のファイルをバックアップする必要があるためです。
以下の例では、find コマンドはファイル システムのルート ディレクトリから開始され、CON.FILE という名前のファイルを検索します。
最初にすべてのファイルと一致し、次にサブディレクトリ内を検索します。
$ find / -name "CON.FILE" - Depth -print
マウント オプションを使用する
現在のファイル システムでファイルを検索するには (他のファイル システムを入力せずに)、find コマンドのマウント オプションを使用できます。
次の例では、現在のディレクトリから開始して、ファイル名が X C で終わるこのファイル システム内にあるファイルを検索します。
$ find . -name "*. ファイルをテープ デバイスにバックアップしたり、テープ デバイスからファイルを復元したりします。 find コマンドを使用してファイル システム全体 (多くの場合、ファイル システムの一部) でファイルを検索し、cpio コマンドを使用してそれらのファイルをテープにバックアップできます。 cpio コマンドを使用して /etc/、/home/、および /apps ディレクトリ内のファイルをバックアップする場合は、以下のコマンドを使用できますが、ファイル システムのルート ディレクトリにいることを忘れないでください:
$ CD /
$find etc home apps - Depth -print | cpio -ivcdC65536 -o /dev/rmt0
(上記の例では、最初の行の終わりにあるコマンドは、コマンドがまだ終了していないことをシェルに伝え、次の行はキャリッジ リターンは無視されます。)
上の例では、相対パスと呼ばれるパスに / がないことに注意してください。相対パスが使用される理由は、これらのファイルをテープから復元するときに、ファイルを復元するパスを選択できるためです。たとえば、これらのファイルを最初に別のディレクトリに復元し、それらに対して特定の操作を実行してから、元のディレクトリに復元することができます。バックアップ中に /etc などの絶対パスが使用された場合、リカバリ時には /etc ディレクトリに復元することしかできず、他に選択肢はありません。上の
の例では、最初に /etc ディレクトリに移動し、次に /home ディレクトリと /apps ディレクトリに移動し、最初にこれらのディレクトリ内のファイルを照合し、次にそのサブディレクトリ内のファイルを照合するように find コマンドに指示しました。その結果はすべて次のようになります。 Piped バックアップのために cpio コマンドに渡されます。ちなみに、上記の例では cpio コマンドで C65536 オプションを使用していますが、B オプションを使用することもできましたが、この方法では、C65536 オプションを使用した後のブロック サイズは 5 1 2 バイトのみになります。 64K バイト (65536/1024)。
シェルコマンドを実行するには exec または ok を使用します
いくつかのファイルを照合した後、それらに対して特定の操作を実行したい場合は、-exec オプションを使用できます。
exec オプションを使用するには、print オプションを同時に使用する必要があります。 find コマンドを確認すると、このコマンドは現在のパスからの相対パスとファイル名のみを出力することがわかります。
ls -l コマンドを使用して一致したファイルを一覧表示するには、find コマンドの -exec オプションに ls -l コマンドを追加します (例: -type f -exec ls -l)。 {} ;
上記の例では、find コマンドは現在のディレクトリ内のすべての通常のファイルと一致し、-exec オプションを指定した ls -l コマンドを使用してそれらを一覧表示します。
$ find logs -type f -mtime +5 -exec rm {} ;
任意の方法を使用してください。シェル内 ファイルを削除する前に、まず対応するファイルを確認する必要があるため、注意してください。 -exec オプションを指定したセーフ モードは、mv や rm などのコマンドを使用するときに使用できます。一致する各ファイルを操作する前にプロンプトが表示されます。次の例では、find コマンドは、ファイル名が .LOG で終わり、変更時刻が 5 日以上前であるすべてのファイルを現在のディレクトリで検索して削除しますが、削除する前にプロンプトが表示されるだけです。
ファイルを削除するにはyキーを押し、削除しない場合はnキーを押します。
-exec オプションを使用すると、任意の形式のコマンドを使用できます。次の例では grep コマンドを使用します。 find コマンドは、最初に「password*」という名前のすべてのファイル (password、password.old、password.bak など) と照合し、次に grep コマンドを実行して、これらのファイルに丸いユーザーが存在するかどうかを確認します。
$find /etc -name "password*" -exec grep "rounder" {} ;
$ find . -regex ".*/[0-9]*/.c" -print
./2234.c
完全な名前とパスのオプションを使用します
ここで、-wholename と -path は上記のフルパスに関連しています。
$ find を使用します。 -path '*phone/pu*'
/ puk.txt
もう 1 つ言及しておきます: -path を使用する一般的な形式は次のとおりです: find [path...] -path pattern...
これは、[path...] 部分で指定されたパス上で、次のことを意味します。すべてに一致するパターン 類似のパターン ディレクトリでファイルを検索するのではなく、ファイルの完全なファイル名。
出力形式
必要なファイルを見つけてファイル名を単調に出力したくない場合は、-printf アクション項目を使用して必要な形式を出力できます。 -printf アクションのパラメーターをいくつか示します。 %p パス名を含む出力ファイル名
%f パス名を除く出力ファイル名
%m 8 進形式の出力ファイルのアクセス許可
%g 出力ファイルが属するグループ
%h 出力ファイルが配置されるディレクトリ名
%u 出力ファイルの所有者名
...
例:
$ find . -user xixi -printf "%m %p //n"
644 ./phone1/hello.c
644 ./0dfe.c
findおよび xargs
xargs コマンドが役に立ちます。 find コマンドは、一致したファイルを xargs コマンドに渡します。また、x a rg s コマンドは、-exec オプションとは異なり、一度にすべてではなく、ファイルの一部のみをフェッチします。このようにして、取得したファイルの最初のバッチを処理し、次に次のバッチを処理することができます。一部のシステムでは、-exec オプションを使用すると、一致したすべてのファイルをパラメータとして一度に実行するのではなく、一致した各ファイルを処理するための対応するプロセスが開始され、プロセスが多すぎるため、システムに問題が発生します。 xargs コマンドを使用する場合、プロセスが 1 つしかないため、パフォーマンスが低下するため、効率は高くありません。また、xargs コマンドを使用する場合、すべてのパラメータを一度に取得するかバッチで取得するか、および毎回取得するパラメータの数は、コマンドのオプションとシステム カーネル内の対応する調整可能なパラメータの数に基づいて決定されます。
次の例では、システム内のすべての通常のファイルを検索し、xargs コマンドを使用して、それらがどのタイプのファイルに属するかをテストします。次の例では、システム全体でメモリ情報ダンプ ファイル (コア ダンプ) を検索し、結果を / tmp/core.log ファイルに保存します:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
次の例では、読み取りおよび書き込み機能を持つすべてのユーザーを検索します。 /apps/audit ディレクトリにあるファイルを実行し、対応する書き込み権限を取り消します。
$ find /apps/audit -perm -7 -print xargs chmod o-w
次の例では、 gr e p コマンドを使用します。すべての通常のファイルでデバイス this を検索するには Word:
$ find / -type f -print | type f -print "DBO"
上記の例では、* の特別な意味をキャンセルするために使用されていることに注意してください。シェルの find コマンド。