преобразование вывода 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("'",'"')