我正在嘗試使用特定目錄中的檔案構建 JSON 物件串列。我正在回圈files并創建預期的輸出物件作為字串。我相信有更好的方法來做到這一點jq。
有人可以幫我嗎?
# input
files=($( ls * ))
prefix="myawesomeprefix"
# expected output
{
"listoffiles": [
{"file":"myawesomeprefix/file1.txt"},
{"file":"myawesomeprefix/file2.txt"},
{"file":"myawesomeprefix/file3.txt"},
]
}
uj5u.com熱心網友回復:
您不應該決議ls. 如果已安裝,您可以使用tree該-J選項生成 JSON 串列,您可以使用以下命令將其轉換為您的需要jq:
tree -aJL 1 | jq '
{listoffiles: first.contents | map({file: ("myawesomeprefix/" .name)})}
'
或更舒適地使用--arg:
tree -aJL 1 | jq --arg prefix myawesomeprefix '
{listoffiles: first.contents | map({file: "\($prefix)/\(.name)"})}
'
uj5u.com熱心網友回復:
這是另一種選擇:
jq -n --arg prefix "myawesomeprefix"\
'.listoffiles = ($ARGS.positional |
map({file:($prefix "/" .)}))'\
--args *
uj5u.com熱心網友回復:
你可以試試漂亮的小命令列工具jc:
ls -l | jc --ls
它將許多 shell 命令的輸出轉換為 JSON。作為參考,請在 Github https://github.com/kellyjonbrazil/jc中查看。
然后您可以使用jq.
uj5u.com熱心網友回復:
如果您沒有任何“有問題的”檔案名,例如名稱中包含新行的檔案名,則以下內容應該有效:
ls -1 | jq -Rn '{ listoffiles: [inputs | { file: "prefix/\(.)" }] }'
它將每一行讀取為字串,并通過inputs過濾器讀取它們(必須與-n空輸入結合)。然后它會構建您的物件。
$ cat <<LS | jq -Rn '{ listoffiles: [inputs | {file:"prefix/\(.)"}] }'
file1
file2
file with spaces
LS
{
"listoffiles": [
{
"file": "prefix/file1"
},
{
"file": "prefix/file2"
},
{
"file": "prefix/file with spaces"
}
]
}
您可以使用forglob,它也應該處理檔案名中的新行。但它需要您鏈接 2 個 jq 命令:
for f in *; do
printf '%s' "$f" | jq -Rs '{file:"prefix/\(.)"}';
done | jq -s '{listoffiles:.}'
要從外部將前綴指定為變數,請使用--arg,例如
jq --arg prefix "yourprefixvalue" '$prefix .'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/513510.html
標籤:json重击jqls
