成功を数えたい処刑されたファイルを削除しましたが消えることはできません。
これが私が持っているものです:
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
ゼロを返すスクリプトの名前のみが印刷されます。出力はスクリプト出力とインターリーブされるため、スクリプト出力を別の場所にリダイレクトしたい場合があります。一方、最後にクールなサマリーを印刷するには、次のようなものを探しています。
{ 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" "$#"
私が設定したシェルオプションを使用すると、**
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) }'