Linux

從 GitHub 儲存庫批量下載某些文件

  • June 7, 2021

*.tar.gz是否可以從GitHub 儲存庫批量/順序下載所有內容?除了手動下載所有內容之外,是否可以使用某個命令來執行此操作,或者我是否必須創建一個腳本?我正在使用 Linux。

您應該首先考慮使用 簡單地複製儲存庫git,然後更容易在版本之間進行比較。這超出了本 Q/A 的範圍。

我提出了兩種方法:一種基於 Web 的方法,以及一種使用 API 的 GitHub 特定方法:

網頁抓取

這是一個快速的髒單行腳本(為了便於閱讀,這里分成多行),需要w3m,和. 這個臨時腳本可能不打算在任何自動化的東西中使用。awk``xargs``curl

  • 用於w3m格式化頁面內容,最後包含所有連結,
  • awk僅提取包含字元串/releases/download/並以 URL 結尾的連結.tar.gz
  • xargs將輸出轉換為命令行參數以提供給
  • curl下載它們。通過添加以下內容,它甚至適用於 n 次並行-P 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, jq. jq將顯示以 . 結尾的每個資產名稱的下載 URL .tar.gz。(首先檢查初始curl轉儲,| 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 中所述per_page預設為 30。添加到 URL?per_page=XX最多可以得到 100 個結果。任何更大的東西都需要一個帶有附加參數的循環&page=Y並檢測它何時結束。

引用自:https://unix.stackexchange.com/questions/653211