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 Security Considerations).これらは
‘-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 \)