Previous: Delete Files, Up: Actions


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 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 \)