jqを使用して配列にJSONオブジェクトを追加する

jqを使用して配列にJSONオブジェクトを追加する

jq私の目標は、bashのコマンド出力を使用してJSONオブジェクトを出力することです。find1行のコマンドでも bash スクリプトでもかまいません。

各出力行にJSONオブジェクトを生成するための次のコマンドがあります。

find ~/ -maxdepth 1 -name "D*" | \
while read line; \
do jq -n \
--arg name "$(basename "$line")" \
--arg path "$line" \
'{name: $name, path: $path}'; \
done

出力は次のとおりです。

{
  "name": "Desktop",
  "path": "/Users/username/Desktop"
}
{
  "name": "Documents",
  "path": "/Users/username/Documents"
}
{
  "name": "Downloads",
  "path": "/Users/username/Downloads"
}

ただし、これらのオブジェクトが配列に存在し、その配列がitems次のように親オブジェクトの単一キー値になるようにする必要があります。

{"items": [
    {
      "name": "Desktop",
      "path": "/Users/username/Desktop"
    },
    {
      "name": "Documents",
      "path": "/Users/username/Documents"
    },
    {
      "name": "Downloads",
      "path": "/Users/username/Downloads"
    }
  ]
}

jq各行の出力文字列に角かっこを追加し('[{name: $name, path: $path}]';)、角括弧を追加しましたが、配列要素間にカンマは追加しませんでした。

可能な解決策を見つけましたここしかし、各行を繰り返しながら使用する方法がわかりません。

ベストアンサー1

このjq 1.5 inputsストリーミングフィルタトリックは効果があるようです。

... | jq -n '.items |= [inputs]'

前任者。

$ find ~/ -maxdepth 1 -name "D*" | 
    while read line; do 
      jq -n --arg name "$(basename "$line")" \
            --arg path "$line" \
        '{name: $name, path: $path}'
    done | jq -n '.items |= [inputs]'
{
  "items": [
    {
      "name": "Downloads",
      "path": "/home/steeldriver/Downloads"
    },
    {
      "name": "Desktop",
      "path": "/home/steeldriver/Desktop"
    },
    {
      "name": "Documents",
      "path": "/home/steeldriver/Documents"
    }
  ]
}

おすすめ記事