27

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

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

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

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

4

11 回答 11

27

是的,但是极端情况和 Unicode 处理会让你陷入困境。最好委托给原生支持它的脚本语言。

$ ls
あ  a  "a"  à  a b  私
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]
于 2012-04-19T18:28:21.073 回答
25

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

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

对 jq 的标志的简短解释:

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

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

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

于 2015-09-02T13:26:09.037 回答
16

您好,您可以使用 sed 和 awk 做到这一点:

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

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

于 2012-04-19T18:38:50.040 回答
13

使用 perl 作为编码器;它保证不会出现故障,无处不在,并且使用管道,它仍然相当干净:

ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
于 2012-04-19T19:23:02.267 回答
2

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

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

这是为了 . directory ,您可以添加任何路径。

于 2015-04-08T12:16:11.380 回答
1

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

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

所以,只需 linux tree 命令,并配置您自己的参数。这里-X给出了 XML 输出!对我来说,没关系,我想有一些脚本可以将 XML 转换为 JSON ..

注意:我认为涵盖了同样的问题。

于 2014-08-04T01:22:41.517 回答
1

这是一个 bash 行

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

无法正确处理",\或文件名中的一些逗号。此外,如果ls在文件名之间放置换行符,也会如此。

于 2012-04-19T18:35:50.693 回答
0

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

我确信一个简单的 Bash 文件就可以完成这项工作。

Bash 输出

于 2012-04-19T18:23:48.313 回答
0

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

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

我没有检查它是否有效,但您可以在此处找到规范

于 2012-04-19T18:28:51.030 回答
-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("'",'"')
于 2012-04-19T18:32:57.677 回答
-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 );
于 2012-04-19T18:41:04.280 回答