我有这个代码来检查我所有 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
默认情况下会对输出进行分组。
你甚至可以让 GNU Parallel 计算 $parent:
doit() {
parent="$1"
Status=$(git -C $parent status)
:
}
... | parallel -j0 doit {//}