是否有可能使用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("'",'"')