파일을 찾아 실행이 성공했는지 확인하세요.

파일을 찾아 실행이 성공했는지 확인하세요.

성공을 세고 싶어처형된파일을 삭제했지만 사라지게 할 수는 없습니다.

이것이 내가 가진 것입니다:

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

스크립트가 실행된 후 -print0을 반환하는 스크립트의 이름만 인쇄됩니다. 출력은 스크립트 출력과 인터리브되므로 스크립트 출력을 다른 곳으로 리디렉션하고 싶을 수도 있습니다. 반면에 마지막에 멋진 요약을 인쇄하려면 다음과 같은 것을 찾고 있을 것입니다.

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

관련 정보