是否可以使用bash脚本将ls
的输出格式化为json数组?要成为有效的json,dirs和文件的所有名称都需要用双引号括起来,用逗号分隔,整个东西需要用方括号括起来。即转换:
jeroen@jeroen-ubuntu:~/Desktop$ ls
foo.txt bar baz
到
[ "foo.txt", "bar", "baz" ]
编辑:我非常喜欢能在所有Linux服务器上运行的东西;因此,不是依赖于python,而是拥有纯粹的bash解决方案。
答案 0 :(得分:18)
是的,但是角落案例和Unicode处理方式将引领您。最好委托一种本地支持它的脚本语言。
$ ls
あ a "a" à a b 私
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]
答案 1 :(得分:13)
使用perl作为编码器;它保证是无障碍的,无处不在,并且有管道,它仍然相当干净:
ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
答案 2 :(得分:12)
如果您知道没有文件名包含换行符,请使用jq:
ls | jq -R -s -c 'split("\n")'
jq标志的简短说明:
-R
将输入视为字符串而不是JSON -s
将所有行连接到数组-c
创建一个紧凑的输出这需要1.4版或更高版本的jq。如果它不适合您,请尝试此操作:
ls | jq -R '[.]' | jq -s -c 'add'
答案 3 :(得分:11)
你好,你可以用sed和awk做到这一点:
ls | awk ' BEGIN { ORS = ""; print "["; } { print "\/\@"$0"\/\@"; } END { print "]"; }' | sed "s^\"^\\\\\"^g;s^\/\@\/\@^\", \"^g;s^\/\@^\"^g"
编辑:更新以解决"
和空格的问题。我使用/@
作为"
的替换模式,因为/
不是文件名的有效字符。
答案 4 :(得分:1)
这是一个重击线
echo '[' ; ls --format=commas|sed -e 's/^/\"/'|sed -e 's/,$/\",/'|sed -e 's/\([^,]\)$/\1\"\]/'|sed -e 's/, /\", \"/g'
无法正确处理文件名中的"
,\
或一些逗号。另外,如果ls
在文件名之间添加换行符,那么也是如此。
答案 5 :(得分:1)
我还在寻找一种将Linux文件夹/文件树输出到某些JSON或XML文件的方法。为什么不使用这个简单的终端命令:
$ tree --dirsfirst --noreport -n -X -i -s -D -f -o my.xml
所以,只需要linux树命令,并配置你自己的参数。这里-X
给出了XML输出!对我来说,没关系,我想有一些脚本可以将XML转换为JSON ..
注意:我认为this涵盖了同样的问题。
答案 6 :(得分:1)
大多数Linux机器已经有python。你所要做的就是:
python -c 'import os, json; print json.dumps(os.listdir("/yourdirectory"))'
这是为了。目录,您可以添加任何路径。
答案 7 :(得分:0)
答案 8 :(得分:0)
你不能像这样使用python脚本吗?
myOutput = subprocess.check_output["ls"]
output = ["+str(e)+" for e in myOutput]
return output
我没有检查它是否有效,但您可以找到规范here
答案 9 :(得分:-1)
应该很容易。
$ 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("'",'"')
答案 10 :(得分:-2)
不要使用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 );