Jq

是否可以使用 jq 從管道創建 JSON 字元串?

  • April 17, 2022

假設我使用該命令find "$HOME" -maxdepth 1 -type d,我得到以下結果:

/home/user/folder1
/home/user/folder2
/home/user/folder3
/home/user/folder4

我想jq在管道上使用並創建不同的 JSON 行,如下所示:

{ "path": "/home/user/folder1", "type":"directory"}
{ "path": "/home/user/folder2", "type":"directory"}
{ "path": "/home/user/folder3", "type":"directory"}
{ "path": "/home/user/folder4", "type":"directory"}

jq我希望通過避免將這個文件夾列表放在一個數組中並在循環中一個一個地創建它們來解決它。在虛擬碼中,這個想法是:

find "$HOME" -maxdepth 1 -type d | jq '.logic-to-create-json-strings'

有可能jq嗎?

此答案假定您的文件名(或您希望 JSON 編碼的任何文本)是有效的 UTF-8。

兩種選擇:

不使用xargs:直接從with呼叫jq路徑名作為位置參數。讀取找到的路徑名,並將它們作為表達式中的數組訪問。對於每個路徑名,創建一個 JSON 對象。find``-exec``--args``$ARGS.positional[]``jq

find "$HOME" -maxdepth 1 -type d \
   -exec jq -n -c '$ARGS.positional[] as $path | { path: $path, type: "directory" }' --args {} +

使用xargs:使用-print0withfind-0withxargs將找到的路徑名從findto安全傳遞xargs。該jq表達式與上述相同,只是路徑名之間傳遞的方式find不同jq

find "$HOME" -maxdepth 1 -type d -print0 |
xargs -0 jq -n -c '$ARGS.positional[] as $path | { path: $path, type: "directory" }' --args

使用上述兩種方法,jq將對找到的路徑名進行編碼,以便能夠將它們表示為 JSON 字元串。


要將讀取到您顯示的一組對像中,您可以使用以下jq命令,該命令從其標準輸入流中讀取:

jq -R -c '{ path: ., type: "directory" }'

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