帶有 xargs 和 jq 的 git clone repos 到名稱為 .owner.login 的子文件夾(.full_name 的一部分)
目標
使用、和將 repos 複製到名為
.owner.login
(Github 的 REST API 中的參數)的子目錄中。jq``git clone``xargs
前言
我在某個地方獲取了一個程式碼,該程式碼允許我使用
jq
、git clone
和xargs
. 但是,我無法對其進行設置,以便為每個儲存庫創建一個新的父目錄。(我是 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;博士
我需要將生成的字元串集成
jq
到xargs
. 但是,jq
將重要的字元串生成到兩個不同的行中,這可能是導致該錯誤的原因,但我不知道如何解決它。
由於您沒有為我們提供特定的 Github 使用者來重現您的特定問題,因此我已經使用我自己認識的其他 Github 帳戶進行了測試。
您的嘗試有兩個主要問題。
xargs
理想情況下,應該引用閱讀的各個論點。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 clone
viaxargs
: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