我正在使用运行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
有更清洁或更快的方法吗?我应该尝试除grep
和find
以外的命令吗?
答案 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生态系统,这可能是一个简化版本的适用于小型设备的操作系统。)