4

私は、簡素化されたシェル (KSH) を持つ QNX を実行する組み込みシステムを使用しています。

以下に一致するファイルシステム上のすべての実行可能ファイルを見つけたい:

*/shle/*-*_test

「sle」ディレクトリは、ルートの下に最大 4 レベルまで表示される場合があります。私の現在のアプローチは、次のコマンドを実行することです。

for shle in ./shle ./*/shle ./*/*/shle ./*/*/*/shle
do
  for exe in $shle/*-*_test
  do
    echo running: $exe
    $exe
  done
done

これを行うためのよりクリーンまたは高速な方法はありますか? と以外に試してみるべきコマンドはありますgrepfind?

4

2 に答える 2

3

globstarオプションを使用して**/shle を指定すると、1 レベル以上の深さのディレクトリを見つけることができます。

kshマンページから:

          ∗      Matches any string, including the null string.  When used
                 for filename expansion, if the globstar option is on, two
                 adjacent  ∗'s  by itself will match all files and zero or
                 more directories and subdirectories.  If followed by a  /
                 then only directories and subdirectories will match.
于 2011-11-04T15:08:15.400 に答える
2

を持っていない場合find、あなたがしたことよりもはるかに良いことはできません: レベルを列挙します。任意のレベルまで下げる必要がある場合は、再帰関数を使用して実行できます (ただし、グローバル変数しかない場合、再帰は注意が必要です)。幸いなことに、既知の最大深度を使用すると、はるかに簡単になります。

改善の余地が少しあります。空白や特殊文字を含むファイル名がどこかにある場合に備えて、すべての変数置換を二重引用符で囲むことをお勧めします。$exeまた、が存在して実行可能かどうかをテスト…/*-*_testしていません (そのパターンが何にも一致しない場合はパターンである可能性があり、実行可能でないファイルである可能性もあります)。

for shle in shle */shle */*/shle */*/*/shle; do
  for exe in "$shle"/*-*_test; do
    test -x "$exe" && "$exe"
  done
done

持っていない場合test(ksh がある場合は組み込みですが、単純なシェルの場合は欠落している可能性があります)、パターンが展開されているかどうかを確認するためのより複雑なテストを行うことができます。

for shle in shle */shle */*/shle */*/*/shle; do
  for exe in "$shle"/*-*_test; do
    case "$exe" in
      */"*-*_test") :;;
      *) "$exe";;
    esac
  done
done

(あなたが を持っていないことに驚いています。QNX にfindは完全な POSIX スイートが付属していると思いましたが、QNX のエコシステムには詳しくありません。これは、小型デバイス用の OS の簡易バージョンである可能性があります。)

于 2011-11-04T23:00:53.807 に答える