すべての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 {//}