正常にカウントしたい実行済みファイルですが、実行できません。
これは私が持っているものです:
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"
スクリプトの内容も表示されてもかまいませんが、軽視する方法はありますか?
スクリプトから返された値を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
スクリプトが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
変数commandline
には、find
コマンドのoutputとすべてのスクリプトが含まれます。他には何もありません。
すべての.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" "$#"
私が設定するシェルオプションは、サブディレクトリに再帰的に照合するために**
グロブを有効にし(globstar
)、一致しないパターンを展開せずに消滅させ(nullglob
)、パターンを作成します非表示の名前(dotglob
)に一致します。
次に、コードは、位置パラメータを.sh
ファイル名サフィックスが付いたファイルのパス名のリストに設定します。ループはリストをループして、それぞれを実行しようとします。実行が成功すると、カウンターが増加します。
最後にカウンタを出力します。
特別な値$#
は、定位置パラメーターのリストの長さ(見つかったスクリプトの数)です。
このコードでは、スクリプトのoutputは考慮されず、終了ステータスのみが考慮されることに注意してください。
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) }'