Curl

帶有 xargs 和 jq 的 git clone repos 到名稱為 .owner.login 的子文件夾(.full_name 的一部分)

  • September 14, 2021

目標

使用、和將 repos 複製到名為.owner.login(Github 的 REST API 中的參數)的子目錄中。jq``git clone``xargs


前言

我在某個地方獲取了一個程式碼,該程式碼允許我使用jqgit clonexargs. 但是,我無法對其進行設置,以便為每個儲存庫創建一個新的父目錄。(我是 Windows 使用者,但對於我想要實現的目標,除了這個 bash 腳本之外,我無法查詢任何其他解決方案。我不知道 GNU 命令如何相互作用,這是我能整理的最多的)

原始程式碼

UserName=CHANGEME; \
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |\
   jq -r '.[].html_url' |\
   xargs -l git clone

這是我的修改:

UserName=CHANGEME; \
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |\
   jq -r '.[] | .html_url, .full_name' |\
   xargs -l git clone

我得到了與原始程式碼相同的結果。這個錯誤日誌: fatal: repository 'repoauthor/reponame?' does not exist

我不知道從哪裡來的\?

所以我嘗試調試它

通過將程式碼拆分為

UserName=CHANGEME; \
curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |\
   jq -r '.[] | .html_url, .full_name'

它返回了這個:

https://github.com/repo1name/repo1author
repo1name/repo1author
https://github.com/repo2name/repo2author
repo2name/repo2author
... etc

它返回2 個不同的行.html_url.full_name而不是單行。

我認為這是問題所在,但後來我嘗試xargs單獨執行:

https://github.com/repoauthor/reponame |\
xargs -l git clone

它只是讓我進入 git 幫助文件。

tl;博士

我需要將生成的字元串集成jqxargs. 但是,jq將重要的字元串生成到兩個不同的行中,這可能是導致該錯誤的原因,但我不知道如何解決它。

由於您沒有為我們提供特定的 Github 使用者來重現您的特定問題,因此我已經使用我自己認識的其他 Github 帳戶進行了測試。

您的嘗試有兩個主要問題。

  1. xargs理想情況下,應該引用閱讀的各個論點。
  2. xargs需要git clone使用兩個單獨的參數呼叫:儲存庫 URL 和複製它的目標目錄。

您可以整理出這樣的論點引用:

curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |
jq -r '.[] | [ .html_url, .full_name ] | @sh'

這將從對請求的響應中提取想要的資訊curl到一個數組中,然後使用@sh運算符將每個這樣的數組輸出為一行 shell 引用的單詞。

嚴格來說,我們也可以將其用作.[] | .html_url, .full_name | @sh表達式jq來獲取帶有單個 shell 引用字元串的行流,這與xargs我們將要使用它的方式無關。

給定這個詞流,然後我們呼叫git clonevia xargs

xargs -n 2 git clone

-n 2方法xargs將一次使用來自其輸入流的兩個參數呼叫該實用程序。

把它放在一起:

curl -s "https://api.github.com/users/$UserName/repos?per_page=1000" |
jq -r '.[] | [ .html_url, .full_name ] | @sh' |
xargs -n 2 git clone

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