首页 > 解决方案 > 读取原始输入行并输出单个数组

问题描述

我有一个目录,里面有文件。我想从该文件列表中创建一个数组。我认为这很容易,例如:

ls mydir | jq -R '[.]'
[
  "file1"
]
[
  "file2"
]
[
  "file3"
]

我唯一能弄清楚的是:

ls mydir | jq -sR '[split("\n")[]|select(.|length>0)]'
[
  "file1",
  "file2",
  "file3"
]

有没有更好的办法?

标签: jsonjqls

解决方案


一般来说,在处理 Unix 文件名时,您必须格外小心。它们几乎可以包含文件名中的任何字符,包括空格、换行符、逗号、管道符号,以及除 NUL 之外您曾经尝试用作分隔符的几乎任何其他内容。最好的办法是用 NUL 字符分隔名称,这是唯一不能成为有效文件名一部分的字符,并用jq

使用本机 shellprintf分隔条目\0并将其分隔回来

printf '%s\0' * | jq -Rn 'inputs | split("\u0000")'

或仅用于文件

for file in *; do 
  [ -f "$file" ] && printf '%s\0' "$file"
done | jq -Rn 'inputs | split("\u0000")'

推荐阅读