我正在尝试列出GitLab项目。我们在子群中有许多群。有些团体有800个或更多的项目。我只能拿到一半的项目。
这是脚本:
echo "Project_id, Project_Name, Project_url, Project_default_branch, Group_id" > result_branch.csv
number_of_pages=$(curl -s --head "https://gitlab.com/api/v4/groups/8523968/projects?private_token=$token" | grep -i x-total-pages | awk '{print $2}' | tr -d 'rn')
for page in $(seq 1 $number_of_pages); do
curl --silent --header "Private-Token: $token" "https://gitlab.com/api/v4/groups/8523968/projects?include_subgroups=true&page=$page" | jq -r '.[] | [.id, .name, .web_url, .default_branch, .namespace.id] | @csv' >> result_branch.csv
cat result_branch.csv | awk {'print$4'} > branches
如何获得所有项目?
我刚刚在本地玩过这个,只做了一些更改就可以使用了。首先,就像@Markus在他的评论中提到的那样,您缺少一个done
来终止for循环。我还将把cat result_branch.csv
语句移到for循环之外,这样它在最后只运行一次。循环现在看起来是这样的:
for page in $(seq 1 $number_of_pages); do
curl --silent --header "Private-Token: $token" "https://gitlab.com/api/v4/groups/8523968/projects?include_subgroups=true&page=$page" | jq -r '.[] | [.id, .name, .web_url, .default_branch, .namespace.id] | @csv' >> result_branch.csv
done
cat result_branch.csv | awk {'print$4'} > branches
下一个问题是由于awk
的默认字段分隔符。在最后一步中,您会得到奇怪的结果,因为awk
使用了默认的字段分隔符,而不是您想要做的:在逗号上打断。这是一个使用-F
标志设置字段分隔符的简单修复:
cat result_branch.csv | awk -F, {'print$4'} > branches
总之,脚本变成了:
echo "Project_id, Project_Name, Project_url, Project_default_branch, Group_id" > result_branch.csv
number_of_pages=$(curl -s --head "https://gitlab.com/api/v4/groups/8523968/projects?private_token=$token" | grep -i x-total-pages | awk '{print $2}' | tr -d 'rn')
for page in $(seq 1 $number_of_pages); do
curl --silent --header "Private-Token: $token" "https://gitlab.com/api/v4/groups/8523968/projects?include_subgroups=true&page=$page" | jq -r '.[] | [.id, .name, .web_url, .default_branch, .namespace.id] | @csv' >> result_branch.csv
done
cat result_branch.csv | awk -F, '{print $4}'
最后需要注意的是,您的两个awk
语句的编写方式不同:awk '{print $2}'
与awk {'print $4'}
。这似乎没有什么不同,因为在我的测试中,我没有调整这些,而且效果很好,但我总是喜欢每次都用同样的方式做这样的事情,所以我建议你使用一种或另一种方式,并坚持下去。