모든 git 폴더의 상태를 확인하는 코드가 있습니다.
find / -maxdepth 3 -not -path / -path '/[[:upper:]]*' -type d -name .git -not -path "*/Trash/*" -not -path "*/Temp/*" -not -path "*/opt/*" -print 2>/dev/null |
{
while read gitFolder; do
(
parent=$(dirname $gitFolder);
Status=$(git -C $parent status)
if [[ $Status == *Changes* ]]; then
echo $parent;
git -C $parent status --porcelain
echo ""
elif [[ $Status == *ahead* ]]; then
echo "Push $parent";
echo
elif [[ $Status == *diverged* ]]; then
echo "Sync $parent";
echo
fi
) &
done
wait
}
순차적으로 실행하면 터미널에서 명확하게 읽을 수 있는 인쇄 결과를 얻을 수 있습니다. 그러나 속도가 느려졌습니다. 병렬로 실행하면( 를 사용하여 &
) 속도가 정말 좋아지지만 출력이 엉망이 됩니다.
어떻게든 각 내부 쉘의 출력을 잠그고 각 내부 쉘의 표준 출력을 블록으로 인쇄할 수 있습니까?
답변1
GNU Parallel은 정확히 다음을 위해 만들어졌습니다.
doit() {
gitFolder="$1"
parent=$(dirname $gitFolder);
Status=$(git -C $parent status)
if [[ $Status == *Changes* ]]; then
echo $parent;
git -C $parent status --porcelain
echo ""
elif [[ $Status == *ahead* ]]; then
echo "Push $parent";
echo
elif [[ $Status == *diverged* ]]; then
echo "Sync $parent";
echo
fi
}
export -f doit
find / -maxdepth 3 -not -path / -path '/[[:upper:]]*' -type d -name .git -not -path "*/Trash/*" -not -path "*/Temp/*" -not -path "*/opt/*" -print 2>/dev/null |
parallel -j0 doit
출력은 기본적으로 그룹화됩니다.
$parent를 계산하도록 GNU Parallel에 요청할 수도 있습니다.
doit() {
parent="$1"
Status=$(git -C $parent status)
:
}
... | parallel -j0 doit {//}