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

Linux 将bash`ls`输出转换为json数组,linux,json,bash,ubuntu,sh,Linux,Json,Bash,Ubuntu,Sh,是否可以使用bash脚本将ls的输出格式化为json数组?要成为有效的json,所有目录和文件的名称都需要用双引号括起来,用逗号分隔,整个内容都需要用方括号括起来。即转换: jeroen@jeroen-ubuntu:~/Desktop$ ls foo.txt bar baz 到 编辑:我非常喜欢能在我所有的Linux服务器上运行的东西;因此,我不依赖python,而是有一个纯bash解决方案。我会编写脚本,运行ls命令,将输出发送到您选择的文件,同时解析输出,将其格式化为有效的JSON格式 我

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

jeroen@jeroen-ubuntu:~/Desktop$ ls
foo.txt bar baz


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

我会编写脚本,运行ls命令,将输出发送到您选择的文件,同时解析输出,将其格式化为有效的JSON格式

我相信一个简单的Bash文件就能完成这项工作


是的,但是拐角处的箱子和Unicode的处理方式会让你很恼火。最好委托给本机支持它的脚本语言

$ ls
あ  a  "a"  à  a b  私
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]

你不能使用像这样的python脚本吗

myOutput = subprocess.check_output["ls"]
output = ["+str(e)+" for e in myOutput]
return output
我没有检查它是否有效,但是您可以发现规范应该非常简单

$ cat ls2json.bash
#!/bin/bash
echo -n '['
for FILE in $(ls | sed -e 's/"/\\"/g')
do
echo -n \"${FILE}\",
done
echo -en \\b']'
然后运行:

$ ./ls2json.bash > json.out
但是python会更容易

import os
directory = '/some/dir'
ls = os.listdir(directory)
dirstring = str(ls)
print dirstring.replace("'",'"')
这是一条狂欢路线

echo '[' ; ls --format=commas|sed -e 's/^/\"/'|sed -e 's/,$/\",/'|sed -e 's/\([^,]\)$/\1\"\]/'|sed -e 's/, /\", \"/g'

无法正确处理文件名中的\或某些逗号。另外,如果ls在文件名之间添加了换行符,那么这也会出现。

您好,您可以使用sed和awk执行此操作:

ls | awk ' BEGIN { ORS = ""; print "["; } { print "\/\@"$0"\/\@"; } END { print "]"; }' | sed "s^\"^\\\\\"^g;s^\/\@\/\@^\", \"^g;s^\/\@^\"^g"

编辑:已更新以解决和空间的问题。我使用/@作为的替换模式,因为/不是文件名的有效字符。

不要使用bash,请使用脚本语言。未经测试的perl示例:

use JSON;
my @ls_output = `ls`; ## probably better to use a perl module to do this, like DirHandle
print encode_json( @ls_output );

使用perl作为编码器;它保证无车,到处都是,而且有管道,它仍然相当干净:

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

我还在寻找一种将Linux文件夹/文件树输出到JSON或XML文件的方法。为什么不使用这个简单的终端命令:

$ tree --dirsfirst --noreport -n -X -i -s -D -f -o my.xml
因此,只需使用linux-tree命令,并配置您自己的参数。这里-X给出了XML输出!对我来说,这没关系,我想有一些脚本可以将XML转换为JSON


注意:我想也包括了同样的问题。

大多数Linux机器已经有了python。你所要做的就是:

python -c 'import os, json; print json.dumps(os.listdir("/yourdirectory"))'

这是给你的。目录,您可以添加任何路径

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

ls | jq-R-s-c“拆分\n[:-1]”

向jq简要解释标志:

-R将输入视为字符串而不是JSON -s将所有行合并为一个数组 -c创建一个紧凑的输出 [:-1]删除输出数组中的最后一个空字符串 这需要jq的1.4版或更高版本。如果不适合您,请尝试以下方法:



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

谢谢,但我更喜欢在任何Linux服务器上都能正常工作的东西;所以我宁愿有一个纯Bash解决方案,99.8%的Linux服务器都有Python可用;诚然,对于较旧版本的Python,您可能需要使用simplejson。没有Python=Hell的服务器。你可能很快也会得到一个perl解决方案。是的,不是每个人都有。我不想要求我的软件的所有用户安装额外的存储库来运行脚本。因此,请直接提供到软件包的链接。您可以添加分隔两个字符串的逗号吗?哦,是的,在翻译中忘记了,修复了,问题是后面会有一个逗号。嗯,棘手的是,最后一个元素后面不应该有逗号,就在]之前,你需要先设置一个变量set=true,然后在循环结束时,将它设置为false。当第一个为false时,在文件前输出逗号。轻松修复,echo-en\\b']',addedy您使用了错误的工具进行作业。如果您担心python不可用,请使用perl。它应该在几乎所有的linux服务器上。有人知道如何通过json操作工具jq来实现这一点吗?请注意,此解决方案无法正确转义名称中的双引号,例如,名为foo\bar的文件显示为foobar而不是foo\bar。此外,名称中带有空格的目录也有问题。-1。这也是一个典型的问题。你能详细说明一下你的awk和sed语句到底在做什么吗?具体来说,awk中的第二条打印语句和第三条sed语句。在这里,s^\/\^^g,我看到您正在转义/@但我看不到您是如何在从ls管道传输的所有条目之间插入逗号的。也不会处理文件名中的制表符、换行符或其他控制字符。-1。这是一个典型的问题。最好在for循环中进行,并完全避免使用管道。有关正确的方法,请参见Glenn Jackman的答案。它保证是无车的,到处都是。。。。除此之外,您必须安装另一个模块。。因此,它并非无处不在。。很抱歉,理想的解决方案涉及到已经可用的组件。您的答案似乎完全重复了我如何将其更改为跟随目录?您可以使用python-c'import os,json对不同的目录执行此操作;print json.dumpsos.listdir/mydirectory/temp“如何仅对文件处理此问题?错误:未定义拆分\n^^^^^^1编译错误我已尝试过bot h ls | jq-R-s-c'拆分\n'和ls | jq-R'[.]'| jq-s-c'添加'。前者在数组中添加了一个额外的空字符串。因此,后者是更好的解决方案。
python -c 'import os, json; print json.dumps(os.listdir("/yourdirectory"))'