web-dev-qa-db-ja.com

ファイルを検索し、それらが正常に実行されたかどうかを確認します

正常にカウントしたい実行済みファイルですが、実行できません。

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

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"

スクリプトの内容も表示されてもかまいませんが、軽視する方法はありますか?

5
Japkutija

スクリプトから返された値を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
5
William Pursell

スクリプトが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
4
Ole Tange

変数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) }'
3
Kusalananda