[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

3. アクション

findの式で与えた基準にマッチするファイルの情報を出力する方法が, いくつかあります.標準出力または指名したファイルに,情報を出力すること が可能です.ファイル名を引数として,コマンドを実行することも可能です. これらのコマンドを,選択したファイルへのフィルター以外の目的で使用する ことが可能です.


3.1 ファイル名の出力

Action: -print

真の時,完全なファイル名を標準出力に出力し,改行を追加します.

Action: -fprint file

真の時,完全なファイル名をファイルfileに出力し,改行を追加します. findの実行時にfileが存在しない場合は作成されます.存在する 場合は0バイトに切り詰められます.ファイル名`/dev/stdout'と `/dev/stderr'は,特別な扱いをされます.それらはそれぞれ,標準出力 と標準エラー出力を参照します.


3.2 ファイル情報の出力

Action: -ls

真の時,現在のファイルを`ls -dils'の書式で標準出力にリストアップし ます.出力は以下のようになります.

 
204744   17 -rw-r--r--   1 djm      staff       17337 Nov  2  1992 ./lwall-quotes

フィールドは以下のとおりです.

  1. ファイルのinodeナンバーです.inodeナンバーを元にしたファイルの検索方法 は,See section ハードリンク.

  2. ファイルのブロック数です.ブロック計算は,512バイトブロック単位を使用す る環境変数POSIXLY_CORRECTが設定されていない場合,1Kブロック単位 です.サイズを元にしたファイルの検索方法は,See section サイズ.

  3. ファイルの形式と権限です.形式は,通常のファイルに対してはダッシュで表 示されます.それ以外のファイル形式に対しては,`-type'に対して使用 される文字です(see section ファイル形式).権限は,読み込み,書き込み,そして実行で, それぞれファイルの所有者,そのグループ,そしてその他のユーザに対するも のです.ダッシュは権限が与えられていないことを意味します.ファイルの権 限の詳細は,See section ファイルの権限. その権限を元にしたファイルの検索 方法は,See section ファイルの権限.

  4. ファイルに対するハードリンクの数です.

  5. ファイルを所有しているユーザです.

  6. ファイルのグループです.

  7. ファイルのバイト単位のサイズです.

  8. ファイルが最後に編集された日付です.

  9. ファイル名です.`-ls'は,ファイル名で使用されている出力不可能な文 字を,Cのようなバックスラッシュエスケープを使用して引用符で囲みます.印 字不可能な文字の扱いは`-ls',`-fls',`-print', `-fprint',`-printf',そして`-fprintf'では同じなので,こ れは将来,変更される可能性があります.

Action: -fls file

真の時,`-ls'に似ていますが,`-fprint'のようにfileに書 き出します(see section ファイル名の出力).

Action: -printf format

真の時,`\'エスケープと`%'指示語を解釈しながら,format を標準出力に出力します.フィールドの幅と精度は,C関数のprintfの ように指定することが可能です.書式フラグ(例えば`#')は,多くのフィー ルドは`%s'で出力されるので,数値的なものであっても期待したように動 作しません.これは,書式フラグ`-'が動作することを意味します.それ はフィールドを左寄せに強制します.`-print'とは異なり, `-printf'は文字列の終わりに改行を追加しません.文字列の終わりを改 行にしたい場合,`\n'を追加してください.

Action: -fprintf file format

真の時,`-printf'に似ていますが,`-fprint'のようにfile に書き出します(see section ファイル名の出力).


3.2.1 エスケープ

`-printf'と`-fprintf'で認識されるエスケープは以下のとおりです.

\a

アラームベル.

\b

バックスペース.

\c

この書式の直後出力の停止し,出力をフラッシュ.

\f

フォームフィード.

\n

改行.

\r

キャリッジリターン.

\t

水平タブ.

\v

垂直タブ.

\\

バックスラッシュそのもの(`\').

\NNN

ASCIIコードがNNNの文字(八進数).

`\'文字に他の文字が続くものは,通常の文字として扱われるので,両方 が出力され,(おそらくそれは入力ミスなので)標準エラー出力に警告メッセー ジが出力されます.


3.2.2 書式指示語

`-printf'と`-fprintf'は,処理しているファイルに関する情報を出 力するため,以下の書式指示語をサポートします.Cのprintf関数での フィールド幅と精度指定は,文字列(`%s')の形式に適用するようにサポー トされています.つまり,それぞれの指示語に対する"最小フィールド幅"."最 大フィールド幅"を指定することが可能です.書式フラグ(例えば`#')は, 多くのフィールドは`%s'で出力されるので,数値的なものであっても期待 したように動作しません.書式フラグ`-'は動作することを意味します. それはフィールドを左寄せに強制します.

`%%'はパーセント記号そのものです.認識できない文字が続く`%'文 字(例えば,既知の指示語でも,printfのフィールド幅や精度指定でも ないもの)は削除され(しかし,認識できない文字は出力されます),(おそらく 入力ミスのため)標準出力に警告メッセージが出力されます.


3.2.2.1 名前指示語

%p

ファイル名(絶対パスではなく,findが見つけたファイル名です - つま り,開始点からの相対パスです).

%f

前置されるディレクトリを削除したファイル名(最後の要素のみ).

%h

ファイル名に前置されるディレクトリ(最後の要素とその前のスラッシュ以外す べて).ファイル名にスラッシュが無い(例えば,コマンドラインで指名されて いたり,現在のワーキング・ディレクトリにある)場合,`%h'は`.' に展開されます.これは,`%h/%f'を`/foo'に展開することが,予想 外でおそらく要求されることでないので,そうすることを避けます.

%P

ファイル名で,それが見つけられたコマンドライン引数の名前は,最初から削 除されます.

%H

それによりファイルが見つけられた,コマンドライン引数.


3.2.2.2 所有者指示語

%g

ファイルのグループ名,または名前が無い場合はグループID.

%G

ファイルの数値的なグループID.

%u

ファイルのユーザ名,または名前が無い場合はユーザID.

%U

ファイルの数値的なユーザID.

%m

ファイルの権限(八進数).数字の前に常にゼロを前置したい場合,例えば`%#m'の ように,`#'書式フラグを使用してください.


3.2.2.3 サイズ指示語

%k

このファイルが使用している1Kブロック単位でのディスク使用量.ディスク領 域はファイルシステムのブロックサイズの倍数を占有するので,これは通常 `%s/1024'より大きくなりますが,ファイルが疎らなファイル(いわゆる "穴"があるもの)の場合は小さくなるはずです.

%b

このファイルが使用している512バイトブロック単位でのディスク使用量.ディ スク領域はファイルシステムのブロックサイズの倍数を占有するので,これは 通常`%s/1024'より大きくなりますが,ファイルが疎らなファイル(いわゆ る"穴"があるもの)の場合は小さくなるはずです.

%s

バイト単位でのファイルサイズ.


3.2.2.4 位置指示語

%d

ディレクトリツリーでのファイルの深さ(コマンドラインで指名されたファイル からの深さで,ルートディレクトリからではありません).コマンドラインのファ イル名は,深さが0です.直下のサブディレクトリは1となり,そのように続い ていきます.

%D

ファイルが存在するデバイス番号(struct statst_devフィー ルド)で,十進数です.

%F

ファイルが存在するファイルシステム.この値は,`-fstype'で使用する ものです(see section ディレクトリ).

%l

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

%i

ファイルのinode番号(十進数).

%n

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

%y

`-type'で使用されるファイルの形式.ファイルがシンボリックリンクの 場合,`l'が出力されます.

%Y

`-type'で使用されるファイルの形式.ファイルがシンボリックリンクの 場合,リンクをたどります.ファイルが壊れているシンボリックリンクの場合, `N'が出力されます.


3.2.2.5 時間指示語

これらの指示語にはCのctime関数を使用するものもあります.その出力 は現在のロカールに依存しますが,典型的なものは以下のようになります.

 
Wed Nov  2 00:42:36 1994
%a

Cのctime関数で返される書式での,ファイルが最後にアクセスされた時 間.

%Ak

kで指定される書式での,ファイルが最後にアクセスされた時間 (see section 時間の書式).

%c

Cのctime関数で返される書式での,ファイルのステータスが最後に変更 された時間.

%Ck

kで指定される書式での,ファイルのステータスが最後に変更された時間 (see section 時間の書式).

%t

Cのctime関数で返される書式での,ファイルが最後に編集された時間.

%Tk

kで指定される書式での,ファイルが最後に編集された時間 (see section 時間の書式).


3.2.3 時間の書式

以下は,指示語`%A',`%C',そして`%T'に対する書式で,それ はファイルのタイムスタンプを出力します.これらの書式には,Cの strftime関数のシステム間での違いにより,すべてのシステムで利用可 能でないものもあります.


3.2.3.1 時間の内容

以下の書式指示語は,時間の単一の内容を出力します.

H

時間(00..23)

I

時間(01..12)

k

時間( 0..23)

l

時間( 1..12)

p

ロカールの午前や午後

Z

タイムゾーン(例えば,EDT),またはタイムゾーンが定義されていない場合は何 も出力しない.

M

分(00..59)

S

秒(00..61)

@

1970年1月1日00:00 GMT以来の秒.


3.2.3.2 日付の内容

以下の書式指示語は,日付の単一の内容を出力します.

a

ロカールの略記された曜日名(Sun..Sat)

A

ロカールの完全な曜日名,可変長(Sunday..Saturday)

b
h

ロカールの略記された月名(Jan..Dec)

B

ロカールの完全な月名,可変長(January..December)

m

月(01..12)

d

日(01..31)

w

曜日(0..6)

j

年間の日付(001..366)

U

日曜日を週の最初の日とした時の,年間の週数(00..53)

W

月曜日を週の最初の日とした時の,年間の週数(00..53)

Y

年(1970…)

y

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


3.2.3.3 時間の書式の組み合わせ

以下の書式指示語は,時間と日付の組み合わせを出力します.

r

時間,12時間制(hh:mm:ss [AP]M)

T

時間,24時間制(hh:mm:ss)

X

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

c

ロカールの日付と時間(Sat Nov 04 12:02:33 EST 1989)

D

日付(mm/dd/yy)

x

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

+

日付と時間を`+'で分離し,例えば`2004-04-28+22:22:05'とします. 時間は,現在のタイムゾーンで与えられたものになります(TZ環境変数で設定さ れたものに影響されるかもしれません).これはGNUの拡張です.


3.2.3.4 書式フラグ

`%m'と`%d'指示語は,`#',`0',そして`+'フラグ をサポートしますが,それ以外の指示語は数値を出力するものでもサポートし ません.これらのフラグをサポートしない数値の指示語には,以下のものが含 まれます.

`G',`U',`b',`D',`k',そして`n'です.

すべてのフィールドは書式化フラグ`-'をサポートし,それは左寄せの フィールドになります.つまり,フィールドの幅がフィールドの実際の内容よ り大きい場合,必要なスペースがフィールド内容のの前ではなく後に出力され ます.


3.3 コマンドの実行

findlocateで作成されたファイル名のリストを,他のコマン ドへの引数として使用することが可能です.この方法で,ファイルへの任意の 動作を実行することが可能です.


3.3.1 単一のファイル

ここに一つのファイルへのコマンドを,一度に実行する方法があります.

Action: -execdir command ;

commandを実行します.0のステータスが返される場合は真です. findは,`-exec'以降のすべての引数を,`;'までの内容から 成り立つ引数をコマンドとして受けとります.それは,文字列`{}'を現 在のファイル名で置換し,コマンドにそれがある場所で処理されます.これら の構文はどちらも,シェルによる展開を防ぐために(`\'を用いて)エスケー プしたり,引用符で囲む必要があります.コマンドは,find を実行し ているディレクトリで実行されます.

例えば,現在のディレクトリのそれぞれのCのヘッダファイルを,ファイル `/tmp/master'と比較するために以下のようにします.

 
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'

それに似たもう一つのオプションとして,`-exec'がサポートされていま すが,余りセキュリティーが高くありません.`-exec'に関するセキュリ ティーの問題の議論は,See section セキュリティの考慮.

Action: -exec command ;

この,余りセキュリティーの高くない`-execdir'アクションの亜種は, POSIXで指定されているものです.主な違いは,findが呼び出されたディ レクトリでコマンドが実行されるということで,`{}'が,マッチしたファ イルのベース名ではなく,開始ディレクトリからの相対パスに展開されること を意味します.


3.3.2 複数のファイル

一度に一つずつのファイルを処理する必要がある時もあります.しかし,これ は不要で,ファイルごとにコマンドを実行するより,できるだけ多くのファイ ルをコマンドで実行した方が速くなります.こうすることで,それぞれのコマ ンドを開始する時間を稼ぐことになります.

`-execdir'と`-exec'アクションには,できるだけ多くのマッチした ファイルを含むコマンドラインを構築する亜種があります.

Action: -execdir command {} +

これは`-execdir command ;'と同じように動作しますが,コマンドの終わ りの`{}'はマッチしたファイルの名前のリストになります.この展開は, システムで利用可能なコマンドラインの最大の長さを越えないように行われま す.コマンドには一つの`{}'だけが可能で,`+'の直前に,最後に 書く必要があります.`{}'直後以外の位置にある`+'は,特別扱い されません(つまり,コマンドの終端ではありません).

Action: -exec command {} +

この,余りセキュリティーの高くない`-execdir'アクションの亜種は, POSIXで指定されているものです.主な違いは,findが呼び出されたディ レクトリでコマンドが実行されるということで,`{}'が,マッチしたファ イルのベース名ではなく,開始ディレクトリからの相対パスに展開されること を意味します.

findが終了する前に,部分的に構築されたコマンドラインが実行されま す.これは,`-quit'アクションで終了された場合もそうなります.しか し,エラーの形式によっては(例えばstat()の呼び出しがカレントディ レクトリで不可能),直後に致命的な終了になります.この状況では,部分的に 構築されたコマンド莱因は呼び出されません(これで,無限ループを抑止しま す).

もう一つの,余りセキュリティは高くありませんが,一度に一つ以上のファイ ルでコマンドを実行する方法は,xargsコマンドを使用する方法で,以 下のように呼び出します.

 
xargs [option…] [command [initial-arguments]]

xargsは通常,標準入力から引数を読み込みます.これらの引数は空白 (それは,ダブルクオートやシングルクオートまたはバックスラッシュで保護可 能)や改行で分離されています.それはcommand (デフォルトで `/bin/echo')を,標準入力から読み込まれた引数が続くあらゆる initial-argumentsを用いて,一回以上実行します.標準入力の空白行は 無視されます.

空白の分離名の代わりに,`find -print0'や`find -fprint0'を使用 し,GNU xargs,GNU tar,GNU cpio,または perlへ,`-0'や`--null'オプションを与えて,出力を処理し た方が安全です.locateコマンドにも,同じことを行う`-0'や `--null'オプションがあります.

以下のように,引数リストを処理するためシェルコマンドの置換(バッククオー ト)を使用することが可能です.

 
grep -l sprintf `find $HOME -name '*.c' -print`

しかし,その方法は,`.c'ファイル名の長さが,オペレーティングシステ ムのコマンドラインの長さの制限を超過する場合,エラーが生じるでしょう. xargsは,制限を超過しないようにするために必要なだけコマンドを実 行することで,その問題を避けます.

 
find $HOME -name '*.c' -print | xargs grep -l sprintf

しかし,標準入力が端末であることを必要とするコマンド(例えば, less)の場合,シェルコマンドの置換の手法や,xargsの `--arg-file'オプションを使用する必要があります.

xargsコマンドは,コマンドが255のステータスで終了したり (xargsがエラーメッセージを出力し停止しています),ファイルの終 わりとなる`--eof'オプションで指定されている文字列を含んでいる行を 読み込むまでは,すべての入力を処理し,コマンドラインを構築し,それを実 行します.


3.3.2.1 安全でないファイル名の扱い

ファイル名には,引用符,バックスラッシュ,空白文字,そして改行でさえ含 めることが可能なので,処理のデフォルトモードでxargsを使用しなが らそれを処理することは安全ではありません.しかし,ほとんどのファイル名 は空白を含まないので,この問題は滅多に発生しません.安全なファイル名だ と知っているファイルを検索している場合のみ,それについて悩む必要はあり ません.

応用する際は,名前に特殊文字を含んでいるため,xargsファイルをう まく処理できない場合も多く,失われるデータもあります.この問題の重要性 は,データの重要性に依存し,それを訂正するためにはできるだけ速く,失っ たものに気づくかに依存します.しかし,ここに,空白で分離した名前の使用 で引き起こされる究極の例があります.以下のコマンドが,毎日cronで 実行される場合,あらゆるユーザは任意のファイルを削除することが可能です.

 
find / -name '#*' -atime +7 -print | xargs rm

例えば,以下のようなことが可能でしょう.

 
eg$ echo > '#
vmunix'

`/'を現在のディレクトリとして,xargsを実行してしまった場合, そして,cronは`/vmunix'を削除するでしょう.

他のファイルを削除するために,例えば`/u/joeuser/.plan'は,以下のよ うにすることで可能でしょう.

 
eg$ mkdir '#
'
eg$ cd '#
'
eg$ mkdir u u/joeuser u/joeuser/.plan'
'
eg$ echo > u/joeuser/.plan'
/#foo'
eg$ cd ..
eg$ find . -name '#*' -print | xargs echo
./# ./# /u/joeuser/.plan /#foo

3.3.2.2 安全なファイル名の扱い

findが出力したファイル名を,他のプログラムでめちゃくちゃにされた り誤解されたりしないで,他のプログラムで使用可能にする方法は以下のよう になります.この方法で生成されたファイル名に,`-0'や`--null' オプションを,GNU xargs,GNU tar,GNU cpio,または, perl に渡すことで,処理することが可能です.

Action: -print0

真です.標準出力の完全なファイル名にヌル文字を続けて出力します.

Action: -fprint0 file

真です.`-print0'ににていますが,fileを`-fprint'のように 書き出します(see section ファイル名の出力).

findutilsのバージョン4.2.4からは,locateプログラムにも同様なこと を行う`--null'オプションがあります.xargsと同様,短い形式の オプション`-0'も使用することが可能です.

ファイル名を安全に処理したいが,コマンドを入力の終わりに繋げて実行する 必要がある場合,以下のようにxargsの`--arg-file'オプションを 使用することが可能です.

 
find / -name xyzzy -print0 > list
xargs --null --arg-file=list munge

上記の例では,見つけることができた`xyzzy'と命名されたすべてのファ イルで,mungeプログラムを実行しまが,mungeの入力は端末に なっています(また,実際にはシェルが標準入力を使用しています).シェルに "処理の代入"機能`<(...)'がある場合,ワンステップで実行することが 可能です.

 
xargs --null --arg-file=<(find / -name xyzzy -print0) munge

3.3.2.3 ファイル名の通常ではない文字

これまで議論したように,findとその他のプログラムでのファイル名の 処理方法について,頻繁に注意する必要があります.findの出力を他の プログラムに渡さず端末に表示させる場合でも,問題になることがあります. 例えば,特定の文字の並びには端末のファンクションキーを再構成するものも あります.findのセキュリティの問題に関する議論は, See section セキュリティの考慮.

通常ではない文字は,以下の記述のように,さまざまなアクションとは別に処 理されます.

` -print0'
` -fprint0'

常に正確なファイル名を出力し,出力が端末の場合でも変更されません.

` -ok'
` -okdir'

常に正確なファイル名を出力し,変更されません.これは将来のリリースで, おそらく変更されるでしょう.

` -ls'
` -fls'

通常ではない文字は常にエスケープされます.空白,バックスラッシュ,そし て二重引用符文字はC形式のエスケープ(例えば,`\f',`\"')で出力 されます.それ以外の通常ではない文字は,八進数を用いて出力されます.そ れ以外の印字可能文字(`-ls'と`-fls'では,八進数の041と0176の間 の文字)は,そのまま出力されます.

` -printf'
` -fprintf'

出力が端末でない場合,そのまま出力されます.それ以外の場合,結果は使用 されている指示語に依存します.

%D, %F, %H, %Y, %y

これらは,ファイルの所有者の制御下には無い値に展開され,そのまま出力さ れます.

%a, %b, %c, %d, %g, %G, %i, %k, %m, %M, %n, %s, %t, %u, %U

これらは,ファイルの所有者の制御下にはある値になりますが,端末に不明瞭 はデータを送るために使用されることが無いので,そのまま出力されます.

%f, %h, %l, %p, %P

これらの指示語の出力は,出力が端末の場合,引用符で囲まれます.

この引用符で囲む手法は,GNU lsと同じ方法で実行されます. `-ls'と`-fls'で使用される引用符で囲むメカニズムとは異なります. findの出力で使用する書式を決定することが可能な場合,通常は改行で はなく`\0'を終端文字として使用するほうが良く,それは,ファイル名に は空白や改行文字を含めることができるからです.

` -print'
` -fprint'

引用符での囲み方は,`-printf'と`-fprintf'の`%p'指示語と 同じ方法で処理されます.スクリプト内やマッチしたファイルが不明瞭な名前 を持つ状況でfindを使用している場合,`-print'の代わりに `-print0'の使用を検討すべきでしょう.

locateプログラムは,findの`-print'アクションと同じ方 法で,ファイル名の通常ではない文字を引用符で囲んだり,エスケープしたり します.

これまで記述してきた動作はまもなく変更される可能性があり,それは,印字 不能な文字列の処理を,`-ls',`-fls',`-print', `-fprint',`-printf',そして`-fprintf'で調和させるためで す.


3.3.2.4 コマンドサイズの制限

xargsで,それぞれの実行時にコマンドに渡す引数の数を制御すること ができます.デフォルトで,ARG_MAX - 2k,または128kまでの小さい方 を,コマンドごとの文字として使用します.それは,制限以内のできるだけ多 くの行と引数を使用します.以下のオプションはこれらの値を変更します.

--no-run-if-empty
-r

標準入力が空白でない文字を含まない場合,コマンドを実行しません.デフォ ルトで,入力が無い場合でもコマンドは一度実行されます.

--max-lines[=max-lines]
-L[max-lines]
-l[max-lines]

最大max-linesの空白でない入力行を,コマンドラインごとに使用します. 省略された場合,max-linesのデフォルトは1です.後置される空白は, 行を数える目的で,入力行を次の入力行に論理的に連結します.`-x'を暗 黙に指定します.より好まれるこのオプションの名前は`-L'で,それは POSIXで指定されています.このオプションは`-I'と互換性があるべきで すが,現在はそうなっていません.

--max-args=max-args
-n max-args

最大max-args個の引数を,コマンドラインごとに使用します.大きさが max-argsを超過した場合,それより小さいものが使用されますが,それ は`-x'オプションが与えられていない場合に限り,その場合は xargsは終了します.

--max-chars=max-chars
-s max-chars

最大max-chars文字を,コマンドラインごとに使用し,それはコマンドと 最初の引数と引数文字列の最後の終端のヌルを含みます.このオプションに大 きすぎたり小さすぎたりする値を指定している場合,警告メッセージが出力さ れ,代わりに適切な上限や下限が使用されます.

--max-procs=max-procs
-P max-procs

max-procsプロセスまで一度に実行します.デフォルトは1です. max-procsが0の場合,xargsは可能な限り多くのプロセスを,一 度に実行します.`-P'とともに,`-n',`-s',または `-L'オプションを使用して下さい.そうしない場合,コマンドが実行され る機会は,一度しかありません.


3.3.2.5 服数のファイル名を分割する

xargsは,処理するファイル名を,コマンドに対して与えた引数の間に 挿入することが可能です.コマンドの大きさを制限するオプションを与えてい ない場合(see section コマンドサイズの制限),このモードの処理は`find -exec'と等価です(see section 単一のファイル).

--replace[=replace-str]
-i[replace-str]

最初の引数のreplace-strがあるところを,入力から読み込まれる名前に 置換します.また,引用符で囲まれていない空白は,引数の最後になりません. その代わりに,入力は改行だけで分離されます.replace-strが省略され た場合,デフォルトは`{}'です(`find -exec'に似ています). `-x'と`-l 1'を暗黙に指定します.例えば,`bills'ディレク トリのそれぞれのファイルをソートし,出力をファイル名に`.sorted'を 後置したものに書き出す時,以下のようにすることで可能です.

 
find bills -type f | xargs -iXX sort -o XX.sorted XX

`find -execdir'を使用した等価のコマンドは以下のようになります.

 
find bills -type f -execdir sort -o '{}.sorted' '{}' ';'

3.3.3 問い合わせ

ユーザに単一のファイル上でコマンドを実行するかどうかを尋ねるため, findのプライマリ`-execdir'の代わりに`-okdir'を,そして findのプライマリ`-exec'の代わりに`-ok'を使用することが 可能です.

Action: -okdir command ;

`-execdir'に似ていますが(see section 単一のファイル),ユーザに(標準入力上 で)最初に尋ねます.応答が`y'や`Y'で始まらない場合,コマンドを 実行せず,偽を返します.

Action: -ok command ;

この,余りセキュリティーの高くない`-okdir'アクションの亜種は, POSIXで指定されているものです.主な違いは,findが呼び出されたディ レクトリでコマンドが実行されるということで,`{}'が,マッチしたファ イルのベース名ではなく,開始ディレクトリからの相対パスに展開されること を意味します.

単一のコマンドで複数のファイルを処理する時,ユーザに問い合わせるため, xargsに以下のオプションを与えます.このオプションを使用する時, コマンドの呼出ごとに処理するファイルの数を制御することが役に立つと分か るでしょう.

--interactive
-p

ユーザにそれぞれのコマンドラインを実行するかどうかプロンプトを表示し, 端末から一行読み込みます.応答が`y'や`Y'で始まる場合のみコマ ンドラインを実行します.暗黙に`-t'が指定されます.


3.4 ファイルの削除

Action: -delete

ファイルやディレクトリを削除します.削除に成功した場合は真です.削除に 失敗した場合,エラーメッセージが出力されます.

コマンドラインで`-delete'アクションを使用すると,自動的に `-depth'オプションがオンになります(see section findの式).


3.5 テストの追加

findの組み込みテストが調査しない,ファイルの属性の調査をすること が可能です.こうするために,findが出力したファイルリストへのフィ ルターとなるプログラムを実行するため,xargsを使用してください. xargsによって実行されるプログラムが行なう仕事を減らすため,リス トが少なくなるように,findの組み込みテストをできるだけ使用して下 さい.findの組み込みテストは,他のプログラムが実行するテストより 速く実行されるでしょう.

効率の問題で,外部プログラムの実行回数を制限することが役に立つこともよ くあります.このため,xargsを使用して"拡張"テストを実装するの は良い考えです.

例えば以下に,`/usr/local'ディレクトリツリー内のstripされていない バイナリの,すべての名前を出力する方法があります.組み込みテストは,通 常のファイルでないものや,実行可能でないファイルで,fileを実行す ることを避けます.

 
find /usr/local -type f -perm /a=x | xargs file | 
  grep 'not stripped' | cut -d: -f1

cutプログラムは,fileの出力からファイル名以降のものすべて を削除します.

しかし,xargsを使用することは,セキュリティの重要な問題に遭遇す ることもあります(see section セキュリティの考慮).これらは `-execdir'を使用することで回避することが可能です.`-execdir' アクションは,他のテスト集の合間やfindのアクションに独自のテスト を書くときにも役に立ちます(例えば,`-prune'を使用したいかもしれま せん).

findの式の中間のどこかで特殊なテストを配置したい場合,テストを実 施するプログラムを実行するために,`-execdir' (または,余りセキュリ ティの高くない`-exec')を使用することが可能です.`-execdir'は, 実行されたプログラムの終了ステータスを評価するので,特殊な属性を検査す るプログラム(それは,シェルスクリプトも可能です)を書くことと,真(ゼロ) や偽(ゼロ以外)のステータスで終了させることが可能です.そのような特殊な テストは,組み込みテストが偽と評価される場合は行なわない新しいプロセス を開始するので,それを組み込みテストの後に配置することは良い考え です.

以下は,引数がstripされているバイナリファイルかどうかを調査する, unstrippedという名前のシェルスクリプトです.

 
#! /bin/sh
file "$1" | grep -q "not stripped"

このスクリプトは,パイプラインの最後のコマンドのステータスでシェルが終 了することに依存し,この場合grepになります.grepは,マッ チが見つかる場合は真で終了し,それ以外では偽で終了します.以下にに(サー チパスにあると仮定している)スクリプトを利用している例があります.それは, ファイル`sbins'内のstripされている実行形式と,`ubins'内の stripされていない実行形式をリストアップします.

 
find /usr/local -type f -perm /a=x \
  \( -execdir unstripped '{}' \; -fprint ubins -o -fprint sbins \)

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on September, 28 2005 using texi2html 1.70.