查找文件并检查是否执行成功

查找文件并检查是否执行成功

我想数成功被处决文件,但我无法让它消失。

这就是我所拥有的:

successfulScripts=0
allScripts=0
commandline=$(find . -name "*.sh" -exec '{}' \;)
    if [ $commandline -gt 0 ]; then
successfulScripts=$(($successfulScripts+1))
allScripts=$(($allScripts+1))
    else
allScripts=$(($allScripts+1))
    fi
echo "$successfulScripts out of $allScripts scripts were executed successfully"

我不介意是否也显示脚本内容,但是有什么办法可以鄙视它吗?

答案1

您可以只find使用脚本返回的值。例如

find . -name "*.sh" -exec '{}' \; -print

将执行脚本,然后-print仅打印返回 0 的脚本的名称。输出将与脚本的输出交错,因此也许您只想将脚本输出重定向到其他地方。另一方面,如果您想在最后打印一个漂亮的摘要,也许您正在寻找类似的内容:

{ find . -name '*.sh' -exec sh -c 'if "$1" >&3; then
    echo success; else echo fail; fi' _ {} \; \
    | awk '/success/{s++} /fail/{e++}
    END {printf "%d successes out of %d\n", s, s + e}
 '; } 3>&1

答案2

如果您的脚本少于 100 个:

find . -name "*.sh" | parallel
echo $? jobs failed

如果您有超过 100 个脚本:

find . -name "*.sh" | parallel --joblog my.log
echo $(cut -f 7 my.log | grep -c '^0$') succeeded

答案3

你的变量commandline将包含输出命令find和所有脚本的。没有其他的。

如果你想运行所有.sh文件并统计有多少个成功执行,那就更容易了

shopt -s globstar nullglob dotglob

set -- ./**/*.sh
printf 'Testing %d scripts...\n' "$#"

success=0
for script do
    "$script" && success=$(( success + 1 ))
done

printf '%d out of %d finished successfully\n' "$success" "$#"

我设置的 shell 选项使**glob 能够递归地匹配到子目录 ( globstar),使不匹配的模式消失而不是保持未展开 ( nullglob),并使模式匹配隐藏名称 ( dotglob)。

然后,代码将位置参数设置为带有.sh文件名后缀的文件的路径名列表。该循环遍历列表并尝试运行每一个。如果运行成功,计数器就会增加。

最后输出计数器。

特殊值$#是位置参数列表的长度(找到的脚本的数量)。

请注意,此代码不关心输出对于任何脚本,只有它们的退出状态。


使用find,您可以输出每次运行的退出状态,然后对这些进行计数:

find . -type f -name '*.sh' -exec sh -c '
    for script do
        "$script" >/dev/null
        printf "%d\n" "$?"
    done' sh {} + |
awk '$1 == 0 { success++ } 
     END     { printf("%d out of %d succeeded\n", success, NR) }'

相关内容