2011-11-04 67 views
4

我正在使用运行QNX的嵌入式系统,该系统具有精简的外壳(KSH)。如何在最小外壳(无grep,find等)中递归搜索目录?

我想定位在符合以下条件的文件系统中所有运行的所有可执行文件:

*/shle/*-*_test 

的“shle”目录可能会出现深下根达4级。我目前的做法是运行以下命令:

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

是否有更干净或更快的方式做到这一点?我应该尝试使用除grepfind以外的其他命令吗?

回答

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 

(我惊讶,你没有find,我认为QNX想出了一个完整的POSIX套件,但我不熟悉QNX生态系统,这可能是小型设备的操作系统的简化版本。)

+0

感谢您的提示!我并不担心试图运行一个不存在的可执行文件(除非这会显着减慢整个过程)。是的,我们的QNX构建被高度剥离以在小型嵌入式设备上运行。 –

+0

“枚举关卡”是什么意思? –

+0

@ justus87我的意思是你已经在做什么:'shle',那是一个; '*/shle',那是两个; '*/*/shle',那是三个,等等。 – Gilles

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. 
+0

它看起来不像th在我的选择可用(并没有shopt启用它),但谢谢! –