ファイルを見つけて実行が成功したことを確認してください。

ファイルを見つけて実行が成功したことを確認してください。

成功を数えたい処刑されたファイルを削除しましたが消えることはできません。

これが私が持っているものです:

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) }'

関連情報