将bash的`ls`输出转换成json数组

是否有可能使用bash脚本来格式化输出的ls到一个json数组? 为了使json有效,所有目录和文件的名字都需要用双引号括起来,用逗号分开,整个东西都需要用方括号括起来。 即转换:

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

 [ "foo.txt", "bar", "baz" ] 

编辑:我非常喜欢在我的所有Linux服务器上都可以使用的东西。 因此,而不是依靠python,但有一个纯粹的bash解决scheme。

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

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

是的,但角落案件和Unicode处理将驱动你在墙上。 更好的委托给脚本语言,它本身就支持它。

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

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

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

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

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

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

对jq标志的简短解释:

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

这需要jq 1.4或更高版本。 试试这个,如果它不适合你:

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

 json="[" sep="" for file in *; do file=${file//\\/\\\\} file=${file//\"/\\\"} printf -v json '%s%s"%s"' "$json" "$sep" "$file" sep=, done json+="]" 

这是一条bash线

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

不会正确地处理文件名中的"\或者某些逗号。另外,如果ls在文件名之间放置换行符,那么这个也是如此。

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

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

这是为了。 目录,你可以添加任何路径。

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

我敢肯定,一个简单的Bash文件将完成这项工作。

Bash输出

你不能使用这样的Python脚本?

 myOutput = subprocess.check_output["ls"] output = ["+str(e)+" for e in myOutput] return output 

我没有检查它是否工作,但你可以在这里找到规格

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

$ tree –dirsfirst –noreport -n -X -i -s -D -f -o my.xml

所以,只要linux的命令,并配置你自己的参数。 这里-X给出了XML输出! 对我来说,这没关系,我想有一些脚本将XML转换为JSON ..注:我认为https://unix.stackexchange.com/questions/90115/convert-output-of-tree-command-to-json -format /涵盖相同的问题。

不要使用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 ); 

应该很容易。

 $ 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("'",'"')