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.positional
jq
find "$HOME" -maxdepth 1 -type d \
-exec jq -n -c \
'$ARGS.positional[] as $path | { path: $path, type: "directory" }' \
--args {} +
使用法xargs
:-print0
withfind
と-0
withを使用して、xargs
見つかったパス名を安全に渡します。パス名が間に渡される方法が異なる点を除いて、式は上記と同じです。find
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
です。
$ARGS.positional[] as $path | { path: $path, type: "directory" }
はい
$ARGS.positional | map({ path: ., type: "directory" })[]
読むワイヤー表示されたオブジェクトのセットを使用すると、jq
標準入力ストリームから読み取る次のコマンドを使用できます。
jq -R -c '{ path: ., type: "directory" }'