web-dev-qa-db-ja.com

bashの `ls`出力をjson配列に変換

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

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

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

編集:私はすべてのLinuxサーバーで機能するものを強く好みます。したがって、Pythonに依存するのではなく、純粋なbashソリューションがあります。

21
Jeroen

エンコーダーとしてPerlを使用します。バグがないことが保証されており、どこにでもあり、パイプを使用しても、それでもかなりクリーンです。

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

はい。ただし、一般的なケースとUnicodeの処理により、壁が押し上げられます。ネイティブでサポートするスクリプト言語に委任することをお勧めします。

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

ファイル名に改行が含まれていないことがわかっている場合は、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'

16
bowel

こんにちは、sedとawkでそれを行うことができます:

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

編集:"およびスペースの問題を解決するために更新されました。 /@はファイル名の有効な文字ではないため、"の置換パターンとして/を使用しています。

13
Tronix117

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

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

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

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

1

ほとんどのLinuxマシンにはすでにPythonがインストールされています。あなたがしなければならないすべてはです:

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

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

1
Adeel Ahmad

これがバッシュラインです

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

ファイル名の"\または一部のカンマを適切に処理できません。また、lsがファイル名の間に改行を置く場合、これもそうします。

1
Lou Franco

個人的には、コマンドlsを実行するスクリプトをコーディングし、選択したファイルに出力を送信しながら、出力を解析して有効なJSON形式にフォーマットします。

簡単なBashファイルで確実に機能します。

バッシュ出力

0
Erwald

pythonこのようなスクリプトは使用できませんか?

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

私はそれが動作するかどうかは確認しませんでしたが、仕様を見つけることができます here

0
DonCallisto