シェル(/bin/sh)を使って findコマンドを実現する



内部コマンドしか使えないような環境向けのシェルスクリプトを利用した findコマンドの実現方法です。

スポンサードリンク

主な内部コマンド

コマンド 説明
set (1) シェル変数を表示
(2) シェルのオプションの設定、解除
(3) 一つのレコードから IFS で区切られたフィールドを取り出して位置パラメータに代入する
shift 位置パラメータの内容をシフトする
echo 与えられた文字列を返す
exit 任意の位置で終了させる
exec シェルに変わって引数で指定されたコマンドを新しいプロセスを作らずに実行する
eval 引数をシェルの入力として解析してから実行する
wait 現在実行している子プロセスの終了を待ち、終了状態を保存する
trap 後始末をしてから終了させる
read 標準入力から一行読み込み引数に指定された変数にその行をIFS で区切って代入する
: 何もしないコマンド。引数の評価をする。

/bin/sh で find コマンドを真似てみる

シェルでは再帰関数が利用できるため、再帰関数を利用してfindコマンドを実装してみました。

使い方

using : find.sh [検索したいディレクトリ] [検索したいファイル名] 

例えば、「framework」ディレクトリ以下の「jni」という文字が含まれているファイルを検索したい場合は次のように記載します。

./find.sh framework *jni*
#!/bin/sh

# don't run it on Soralis
cmpValue() {
    pattern=${1%${2}}
    if [ "${pattern}" != "${1}" ]; then
        echo "`pwd`/${1}"
    fi
}

recFind() {
    for line in * ; do
        if [ -L $line ] ; then # symblic link
	elif [ -d $line ] ; then
            cmpValue $line $1
            (cd $line; recFind $1)
        elif [ -f $line ] ; then # file
            cmpValue $line $1
	fi
    done
}

cd $1
recFind $2

ファイル・フォルダ名から指定された文字を比較しています。パラメータ後方から、パターンに最短一致した部分を除いています。

利用する場合にはfind.shに実行権限を付けて下さい。

スポンサードリンク