如何递归搜索最小shell中的目录(没有grep,find等)?

时间:2011-11-04 15:03:36

标签: bash shell glob qnx

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

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

*/shle/*-*_test

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

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

有更清洁或更快的方法吗?我应该尝试除grepfind以外的命令吗?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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,它是内置的,但如果它是一个精简的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生态系统,这可能是一个简化版本的适用于小型设备的操作系统。)