4

我正在使用运行 QNX 的嵌入式系统,该系统具有精简的外壳 (KSH)。

我想找到文件系统上与以下内容匹配的所有运行所有可执行文件:

*/shle/*-*_test

“shle”目录在根目录下最多可能出现 4 层。我目前的方法是运行以下命令:

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

有没有更清洁或更快的方法来做到这一点?除了我应该尝试的命令之外grep,还有其他命令吗?find

4

2 回答 2

3

您可以尝试使用globstar选项并指定 **/shle 来查找一层或多层深的目录。

从 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,你就不能做得比你所做的更好:枚举级别。如果您需要降低到任意级别,您可以使用递归函数来完成(但请注意,当您只有全局变量时,递归很棘手)。幸运的是,有了已知的最大深度,它就简单多了。

有一点改进的余地:最好在所有变量替换周围加上双引号,以防某处的文件名包含空格或特殊字符。而且您没有测试 is 是否$exe存在和可执行(…/*-*_test如果该模式不匹配任何内容,它可能是模式,或者它可能是不可执行的文件)。

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

如果你甚至没有test(如果你有 ksh,它是内置的,但如果它是一个精简的 shell,它可能会丢失),你可能会通过更复杂的测试来查看模式是否被扩展:

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

(我很惊讶你没有find,我以为 QNX 带有完整的 POSIX 套件,但我不熟悉 QNX 生态系统,这可能是小型设备操作系统的精简版本。)

于 2011-11-04T23:00:53.807 回答