성공을 세고 싶어처형된파일을 삭제했지만 사라지게 할 수는 없습니다.
이것이 내가 가진 것입니다:
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
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
답변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) }'