将bash`ls`输出转换为json数组

Jer*_*oen 21 linux bash ubuntu json sh

是否可以使用bash脚本格式化lsjson数组的输出?要成为有效的json,dirs和文件的所有名称都需要用双引号括起来,用逗号分隔,整个东西需要用方括号括起来.即转换:

jeroen@jeroen-ubuntu:~/Desktop$ ls
foo.txt bar baz
Run Code Online (Sandbox Code Playgroud)

[ "foo.txt", "bar", "baz" ]
Run Code Online (Sandbox Code Playgroud)

编辑:我非常喜欢能在所有Linux服务器上运行的东西; 因此,不是依赖于python,而是拥有纯粹的bash解决方案.

Ign*_*ams 18

是的,但角落案例和Unicode处理将引起你的反响.最好委托一种本地支持它的脚本语言.

$ ls
?  a  "a"  à  a b  ?
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]
Run Code Online (Sandbox Code Playgroud)

  • 99.8%的Linux服务器都有Python可用; 不可否认,对于旧版本的Python,您可能需要使用simplejson. (7认同)

Dav*_*ave 14

使用perl作为编码器; 它保证是无障碍的,无处不在,并且使用管道,它仍然相当干净:

ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
Run Code Online (Sandbox Code Playgroud)

  • ** - **1.这会遇到经典的[Parsing LS](http://mywiki.wooledge.org/ParsingLs)问题.最好在for循环中完成它并完全避免管道.请参阅Glenn Jackman对正确方法的回答. (4认同)
  • “它保证没有错误,无处不在”......除了你必须安装另一个模块......所以它不是无处不在......对不起,但理想的解决方案涉及已经可用的组件 (2认同)

小智 14

如果您知道没有文件名包含换行符,请使用jq:

ls | jq -R -s -c 'split("\n")'

jq标志的简短说明:

  • -R 将输入视为字符串而不是JSON
  • -s 将所有行连接成一个数组
  • -c 创建一个紧凑的输出

这需要版本1.4或更高版本的jq.如果它不适合您,请尝试此操作:

ls | jq -R '[.]' | jq -s -c 'add'


Tro*_*117 12

你好,你可以用sed和awk做到这一点:

ls | awk ' BEGIN { ORS = ""; print "["; } { print "\/\@"$0"\/\@"; } END { print "]"; }' | sed "s^\"^\\\\\"^g;s^\/\@\/\@^\", \"^g;s^\/\@^\"^g"
Run Code Online (Sandbox Code Playgroud)

编辑:更新以解决"与空格的问题.我/@用作替换模式",因为/它不是文件名的有效字符.