変更された「find」関数のスクリプトでの引数処理?

変更された「find」関数のスクリプトでの引数処理?

私は 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

関連情報