Получить содержимое файлов с одинаковыми именами во вложенных папках для получения массива JSON

Решение этой проблемы найдено. Если вы удалите опцию munge links из rsyncd.conf, а затем измените chroot = yes, ваши символические ссылки будут перенесены без проблем.

Хотя это откроет возможную дыру в безопасности, где все может быть символически связано, и нет защиты, для защиты которой были разработаны ссылки манжа и chroot. Таким образом, использование этого решения зависит от конкретной среды

.
1
24.04.2021, 21:29
1 ответ

Использование толькоjq(дважды )и петли оболочки:

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
    jq -n \
        --arg ID "$(basename "$pathname")" \
        --arg temp "$(cat "$pathname"/temperature)" \
        '{ ID: $ID, temp: $temp }'
done |
jq -s '. | map(.temp = (.temp | tonumber / 1000) )'

Цикл повторяется по путям, соответствующим каталогам, начинающимся с 28-, которые вы упомянули в вопросе. Цикл использует jqдля создания одного объекта JSON для каждого каталога, состоящего из элемента IDи элемента temp. Значение для IDбудет просто базовым именем пути к каталогу, а температура считывается из файла temperatureв каталоге.

Эти отдельные объекты JSON затем передаются второму процессу jq, который создает их массив с помощью параметра -s(--slurp). Он также изменяет элемент tempкаждого объекта путем преобразования его из строки в число и деления на 1000 (об этом вы никогда ничего не говорили, так что я предполагаю ).

То же самое, но с использованием чуть более удобной joутилиты внутри цикла:

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
    jo  ID="$(basename "$pathname")" \
        temp="$(cat "$pathname"/temperature)"
done |
jq -s '. | map(.temp /= 1000 )'

Утилита joдополнительно определяет, что tempявляется числом, поэтому нам не нужно позже преобразовывать их из строк.

Оба этих цикла создадут «симпатичный -печатный» JSON, например

[
  {
    "ID": "28-00000cbece90",
    "temp": 21.812
  },
  {
    "ID": "28-00000cbece91",
    "temp": 21.812
  }
]

Добавьте опцию-c(--compact-output)к окончательному jq, чтобы вместо этого получить компактный вывод, например

[{"ID":"28-00000cbece90","temp":21.812},{"ID":"28-00000cbece91","temp":21.812}]
3
28.04.2021, 22:51

Теги

Похожие вопросы