Ответ 1
Использовать perl в качестве кодировщика; он гарантированно является не-багги, повсюду, и с трубами, он все еще достаточно чист:
ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
Можно ли использовать bash script для форматирования вывода ls
в массив json? Чтобы быть действительным json, все имена файлов и файлов должны быть заключены в двойные кавычки, разделенные запятой, и все это нужно обернуть в квадратные скобки. То есть конвертировать:
[email protected]:~/Desktop$ ls
foo.txt bar baz
к
[ "foo.txt", "bar", "baz" ]
edit: Я сильно предпочитаю то, что работает на всех моих Linux-серверах; следовательно, скорее не зависит от python, а имеет чистое решение bash.
Использовать perl в качестве кодировщика; он гарантированно является не-багги, повсюду, и с трубами, он все еще достаточно чист:
ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
Да, но угловые футляры и обработка Юникодом заставят вас подняться по стене. Лучше делегировать язык сценариев, поддерживающий его изначально.
$ 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 "\/\@"$0"\/\@"; } 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'
json="["
sep=""
for file in *; do
file=${file//\\/\\\\}
file=${file//\"/\\\"}
printf -v json '%s%s"%s"' "$json" "$sep" "$file"
sep=,
done
json+="]"
Здесь bash line
echo '[' ; ls --format=commas|sed -e 's/^/\"/'|sed -e 's/,$/\",/'|sed -e 's/\([^,]\)$/\1\"\]/'|sed -e 's/, /\", \"/g'
Не будет иметь дело с "
, \
или некоторыми запятыми в имени файла. Кроме того, если ls
ставит новые строки между именами файлов, то и будет.
В большинстве машин Linux уже есть python. все, что вам нужно сделать, это:
python -c 'import os, json; print json.dumps(os.listdir("/yourdirectory"))'
Это для. directory, вы можете добавить любой путь.
Personnaly, я бы закодировал script, который выполнил бы команду ls, отправив вывод в выбранный вами файл при разборе вывода, чтобы сделать его формат в допустимом формате JSON.
Я уверен, что простой файл Bash выполнит эту работу.
Не можете ли вы использовать python script следующим образом?
myOutput = subprocess.check_output["ls"]
output = ["+str(e)+" for e in myOutput]
return output
Я не проверял, работает ли он, но вы можете найти спецификацию здесь
Я также искал способ вывода каталога 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/ охватывает тот же вопрос.
Должно быть довольно легко.
$ 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("'",'"')
Не используйте bash, используйте язык сценариев. Пример непроверенного примера:
use JSON;
my @ls_output = `ls`; ## probably better to use a perl module to do this, like DirHandle
print encode_json( @ls_output );