преобразование вывода bash ' ls` в массив json

можно ли использовать скрипт bash для форматирования вывода ls в массив json? Чтобы быть действительным json, все имена dirs и файлов должны быть завернуты в двойные кавычки, разделенные запятой, и все это должно быть завернуто в квадратные скобки. Т. е. преобразовать:

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

to

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

edit: я сильно предпочитаю то, что работает на всех моих серверах Linux; следовательно, скорее не зависит от python, но имеет чистое решение bash.

11 ответов


используйте perl как кодировщик; он гарантированно будет non-buggy, везде, и с трубами, он все еще разумно чист:

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

да, но угловые случаи и обработка Unicode заставят вас подняться на стену. Лучше делегировать язык сценариев, который поддерживает его изначально.

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

привет вы можете сделать это с помощью sed и awk:

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

EDIT: обновлено для решения проблемы с " и пробелы. Я использую /@ как шаблон для замены " С / недопустимый символ для имени файла.


если вы знаете, что имя файла не содержит новых строк, используйте jq:

ls | jq -R -s -c 'split("\n")'

краткое объяснение флагов jq:

  • -R обрабатывает входные данные как строку вместо json
  • -s объединяет все строки в массив
  • -c создает компактный вывод

для этого требуется версия 1.4 или более поздняя jq. Попробуйте это, если это не работает для вас:

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


вот линия bash

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

не будет должным образом иметь дело с ", \ или некоторые запятые в имени файла. Кроме того, если ls помещает новые строки между именами файлов, так будет.


большая часть Linux-машины уже имеет python. все, что вам нужно сделать, это:

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

Это для . каталог, вы можете добавить любой путь.


Я также искал способ вывода дерева папок / файлов Linux в некоторый файл JSON или XML. Почему бы не использовать эту простую терминальную команду:

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

Итак, просто команда дерева linux и настройте свои собственные параметры. Вот!--1--> дает выход XML! Для меня это нормально, и я думаю, что есть какой-то скрипт для преобразования XML в JSON ..

примечание: Я думаю этой охватывает один и тот же вопрос.


Personnaly, я бы закодировал скрипт, который будет запускать команду ls, отправлять вывод в файл по вашему выбору При разборе вывода, чтобы форматировать его в допустимый формат JSON.

Я уверен, что простой файл Bash сделает работу.

Баш выход


вы не можете использовать такой скрипт python?

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

Я не проверял, работает ли он, но вы можете найти спецификацию здесь


Не используйте 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("'",'"')