私は FreeBSD を使用しており、コマンドがサブディレクトリに降りるのを防ぐために、-prune
オプション onを理解して使用find
しています。しかし、必要な構文は非常に扱いにくく、不自然だと思います。また、削除されたディレクトリ自体が表示されるのを防ぐこともできません。これは修正可能ですが、煩わしいです。
コマンド-noenter
に新しい引数を追加する効果を持つ短いスクリプト/エイリアスを作成したいと思います。find
もし他のプライマリよりも先に与えられます(簡潔にするため)。
目標は、次のいずれかを入力できるようにすることです。
find -xs /dir -noenter '$*' -name '*.conf' -ls
find -x -s /dir -noenter '$*' -name '*.conf' -ls
引数を変換して実行します:
/usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
/usr/bin/find -x -s /dir \( SNIPPED \) -ls
ただし、通常のルーチン「find」コマンドを入力すると、コマンドが透過的に渡されて/usr//bin/find
実行されます。
論理的には、スクリプトは dir 名の後の最初の引数を識別し、それが次の条件に該当するかどうかをテストする必要があります。
- ... と等しく、その後に少なくとも 2 つ以上の引数が続きます (この場合、どの引数がその前/後にあるかがわかるので、
-noenter
渡す必要のある引数を構築する方法がわかります)。/usr/bin/find
または - ... と等しい
-noenter
が、その後に少なくとも 2 つ以上の引数が続かない (= エラー);または - ...その他または dir が最後の引数であったか、見つからなかった (= 元の引数全体を
/usr/bin/find
変更せずに渡します)。
1 つを除いて、これらすべてを実行できます。argv を調べて、どの arg 番号 (ある場合) が引数であるかを判断するスクリプトの部分をどのようにコーディングすればよいでしょうかdir
。
私がこのシェルを選択したのはsh
スクリプト作成のためです。
答え1
特定の引数の存在と場所をテストしたい場合は、コマンド ラインを解析し、各引数が「期待される」値と一致するかどうかをテストするだけです。つまり、各引数の値をテストし-noenter
、変数の位置と名前を示す行を印刷する必要があります-noenter
。
for i in `seq 1 $#`; do
ref=`eval "echo \\$$i"`
if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done
今度は同じことですが、引数の位置のみが-noenter
に格納され$mitsos
、その前の引数の位置が に格納されます$mary
。
for i in `seq 1 $#`; do
ref=`eval "echo \\${$i}"`
if [ $ref == '-noenter' ]; then
mitsos=$i
eva=$(($i-1))
mary=`eval "echo \\${$eva}"`
break
fi
done
そして、現在、$mitsos
の位置、-noenter
または に値がなく、$mary
の前の引数の値を持つ-noenter
。この時点で、が$mary
値を持っている場合、/dir
知る次の引数は であり-noenter
、 の実装を続行できますfind
。そうでない場合は、システムのバージョンを使用するか、エラー メッセージを出力します。最後に、 の位置を気にしない場合は、-noenter
行 を省略できますmitsos=$i
。