Преобразовать bash `ls` вывод в json array - программирование
Подтвердить что ты не робот

Преобразовать bash `ls` вывод в json array

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

[email protected]:~/Desktop$ ls
foo.txt bar baz

к

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Краткое описание флагов для jq:

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

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

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

Ответ 5

json="["
sep=""
for file in *; do
    file=${file//\\/\\\\}
    file=${file//\"/\\\"}  
    printf -v json '%s%s"%s"' "$json" "$sep" "$file"
    sep=,
done
json+="]"

Ответ 6

Здесь bash line

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Bash ouput

Ответ 9

Не можете ли вы использовать python script следующим образом?

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

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

Ответ 10

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

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

так что просто команда linux tree и настройте свои собственные параметры. Здесь -X дает выход XML! Для меня это нормально, и я предполагаю, что некоторые script преобразуют XML в JSON.. ПРИМЕЧАНИЕ. Я думаю, что https://unix.stackexchange.com/questions/90115/convert-output-of-tree-command-to-json-format/ охватывает тот же вопрос.

Ответ 11

Должно быть довольно легко.

$ 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("'",'"')

Ответ 12

Не используйте bash, используйте язык сценариев. Пример непроверенного примера:

use JSON;
my @ls_output = `ls`; ## probably better to use a perl module to do this, like DirHandle
print encode_json( @ls_output );