首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将bash `ls`输出转换为json数组

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

Stack Overflow用户
提问于 2012-04-20 02:19:51
回答 11查看 30.6K关注 0票数 25

可以使用bash脚本将ls的输出格式化为json数组吗?要使json有效,目录和文件的所有名称都需要用双引号括起来,用逗号分隔,整个内容需要用方括号括起来。例如,转换:

代码语言:javascript
代码运行次数:0
运行
复制
jeroen@jeroen-ubuntu:~/Desktop$ ls
foo.txt bar baz

代码语言:javascript
代码运行次数:0
运行
复制
[ "foo.txt", "bar", "baz" ]

编辑:我强烈喜欢在我所有的Linux服务器上都能工作的东西;因此,我不想依赖python,而是有一个纯bash解决方案。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-04-20 03:23:02

使用perl作为编码器;它被保证是无buggy的,无处不在,而且有了管道,它仍然相当干净:

代码语言:javascript
代码运行次数:0
运行
复制
ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
票数 13
EN

Stack Overflow用户

发布于 2012-04-20 02:28:21

是的,但是转角的情况和Unicode的处理会把你逼上绝路。最好委托一种本机支持它的脚本语言。

代码语言:javascript
代码运行次数:0
运行
复制
$ ls
あ  a  "a"  à  a b  私
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]
票数 27
EN

Stack Overflow用户

发布于 2015-09-02 21:26:09

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

ls | jq -R -s -c 'split("\n")[:-1]'

对jq的标志的简短解释:

  • -R将输入视为字符串而不是JSON
  • -s将所有行连接到一个array
  • -c中创建紧凑的output
  • [:-1]删除输出数组中的最后一个空字符串

这需要1.4或更高版本的jq。如果对你不起作用,试试这个:

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

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10234327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档