27

bashスクリプトを使用しての出力をlsjson配列にフォーマットすることは可能ですか?有効なjsonであるためには、dirとファイルのすべての名前を二重引用符で囲み、コンマで区切る必要があり、全体を角かっこで囲む必要があります。つまり、変換します:

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]出力配列の最後の空の文字列を削除します

これには、バージョン1.4以降のjqが必要です。うまくいかない場合は、これを試してください。

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"))'

これがためのものです 。ディレクトリ、任意のパスを追加できます。

于 2015-04-08T12:16:11.380 に答える
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 に答える
1

Linuxフォルダー/ファイルツリーをJSONまたはXMLファイルに出力する方法も探していました。この単純なターミナルコマンドを使用してみませんか。

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

したがって、Linuxツリーコマンドだけで、独自のパラメータを設定します。ここ-XにXML出力があります!私にとってはそれで問題ありません。XMLをJSONに変換するスクリプトがあると思います。

注:これは同じ質問をカバーしていると思います。

于 2014-08-04T01:22:41.517 に答える
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 に答える