jqを使用してパイプからJSON文字列を生成できますか?

jqを使用してパイプからJSON文字列を生成できますか?

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フォルダリストを配列に配置し、ループ内で1つずつ作成することを避けるために、この問題を解決したいと思います。疑似コードでは、アイデアは次のとおりです。

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

それを使用できますかjq

ベストアンサー1

この回答では、ファイル名(またはJSONエンコードするテキスト)が有効なUTF-8であると想定しています。

2つのオプション:

使用しない: 位置引数として pathname をxargs直接呼び出します。jq見つかったパス名を読み取り、式の配列としてアクセスします。各パス名に対してJSONオブジェクトが作成されます。find-exec--args$ARGS.positionaljq

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

使用法xargs-print0withfind-0withを使用して、xargs見つかったパス名を安全に渡します。パス名が間に渡される方法が異なる点を除いて、式は上記と同じです。findxargsjqfindjq

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

上記の両方の方法を使用すると、jq見つかったパス名がJSON文字列として表示されるようにエンコードされます。

言い換えれば、効果は同じjqです。

$ARGS.positional[] as $path | { path: $path, type: "directory" }

はい

$ARGS.positional | map({ path: ., type: "directory" })[]

読むワイヤー表示されたオブジェクトのセットを使用すると、jq標準入力ストリームから読み取る次のコマンドを使用できます。

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

おすすめ記事