从 GitHub 存储库批量下载某些文件

从 GitHub 存储库批量下载某些文件

*.tar.gz是否可以批量/顺序下载所有GitHub 仓库?是否可以使用特定命令来下载所有内容,或者我必须创建一个脚本,而不是手动下载所有内容?我正在使用Linux。

答案1

您应该首先考虑简单地使用 克隆存储库git,然后更容易在版本之间进行比较。这超出了本问答的范围。

我提出两种方法:基于 Web 的方法和使用 API 的 GitHub 特定方法:

网页抓取

这是一个快速而肮脏的单行脚本(为了便于阅读,这里分为多行),需要w3mawk和。这个临时脚本可能不适合在任何自动化操作中使用。xargscurl

  • 用于w3m格式化页面内容,所有链接都在末尾,
  • awk/releases/download/仅提取包含字符串并以.tar.gzURL结尾的链接,
  • xargs将输出转换为命令行参数以提供给
  • curl下载它们。通过添加-P n以下内容,它甚至适合 n 并行下载xargs

w3m -o display_link_number=1 -dump https://github.com/GloriousEggroll/proton-ge-custom/releases | 
    awk '$1 ~ /\[[0-9]+\]/ && $2 ~ /\/releases\/download\/.*\.tar\.gz$/ { print $2 }' | 
    xargs -n 1 curl -JRLO 

echo在之前插入curl以防止下载实际发生,输出如下:

curl -JRLO https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.10-GE-1/Proton-6.10-GE-1.tar.gz
curl -JRLO https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.9-GE-2-github-actions-test/Proton-6.9-GE-2-github-actions-test.tar.gz
curl -JRLO https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.9-GE-2/Proton-6.9-GE-2.tar.gz
curl -JRLO https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.9-GE-1/Proton-6.9-GE-1.tar.gz
curl -JRLO https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.8-GE-2/Proton-6.8-GE-2.tar.gz
curl -JRLO https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.8-GE-1/Proton-6.8-GE-1.tar.gz

注意:该-o display_link_number=1选项并未真正记录下来,但作为示例出现在w3m的手册页

这将仅限于第一页的内容,因此不会提供所有下载。由于下一页链接需要知道内容(特别是页面中最后显示的版本),因此处理此问题会变得过于复杂。

最好使用...

GitHub REST API

有一个与发布相关的 GitHub API该任务似乎不需要任何凭据,并以 JSON 格式输出其结果,适合使用脚本处理jq(它通常作为分发包提供)。这就需要curl,,xargs。将显示名称以 结尾的每个资产的下载 URL 。 (首先检查初始jqjq.tar.gz卷曲转储| jq .允许找到有用的部分)。

curl -H 'Accept: application/vnd.github.v3+json' 'https://api.github.com/repos/GloriousEggroll/proton-ge-custom/releases' | 
    jq -r '
        .[].assets[] | if .name | endswith(".tar.gz") then
            .browser_download_url
        else
            empty
        end' | 
    xargs -n 1 curl -JRLO

echo在最后一个方法之前插入curl将给出与第一种方法相同的输出,只不过会有 30 个而不是 ~ 6 个。

作为API 中描述的,每页默认为 30。添加到 URL?per_page=XX最多可以显示 100 个结果。任何更大的东西都需要一个带有附加参数的循环&page=Y并检测它何时结束。

相关内容