Как получить штамп в сценарии оболочки в файле JSON с помощью инструмента jq?

В некоторые части вашего scope.shможно включить команды для проверки размера файла.

Сначала добавьте новую функцию (и вставьте код выше handle_extension()вscope.sh):

drop_bigsize() {
    # 51200 == 50 MB * 1024
    # change this number for different sizes
    if [[ `du "${FILE_PATH}" | cut -f1` -gt 51200 ]]; then
        echo '----- TOO BIG FILE -----'
        exit 0
    fi
}

Во-вторых, вызовите эту функцию где-нибудь в scope.sh.
Например, приведенный ниже код предотвратит предварительный просмотр любых файлов размером более 50 МБ (— это последние несколько строк изscope.sh):

...
MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )"

### start of new block ###
drop_bigsize
### end of new block ###

if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then
    handle_image "${MIMETYPE}"
fi

handle_extension
handle_mime "${MIMETYPE}"
handle_fallback

exit 1

Чтобы делать такие вещи с некоторыми определенными типами файлов, например. для некоторых архивов вам потребуется поместить один и тот же блок кода в другую часть вашегоscope.sh:

...
handle_extension() {
    case "${FILE_EXTENSION_LOWER}" in
        # Archive
        a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\
        rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)
            ### start of new block ###
            drop_bigsize
            ### end of new block ###
            atool --list -- "${FILE_PATH}" && exit 5
            bsdtar --list --file "${FILE_PATH}" && exit 5
            exit 1;;
        rar)
            # Avoid password prompt by providing empty password
            unrar lt -p- -- "${FILE_PATH}" && exit 5
            exit 1;;
...
3
18.06.2021, 10:39
1 ответ

Функция strptime()используется для синтаксического анализа форматированного времени (обратного действия strftime()). Вы хотите strftime().

Использованиеjq:

jq -n 'now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'

Здесь используется strftime()для форматирования времени, заданного функцией now. Используйте strflocaltime()для преобразования времени в местное время.

Если это слишком многословно или кажется неэффективным (, мы на самом деле вызываем strftime()один раз для каждого элемента массива date! ), затем рассмотрите возможность создания HH:MM:SSметки времени строки , а затем разделения ее на двоеточия:

jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'

Любая из приведенных выше команд может привести к

{
  "date": [
    "07",
    "01",
    "23"
  ]
}

Полный скрипт (использует joдля безопасного создания начального массива vtgиз значений именованного bashмассива):

#!/bin/bash

value=(11.769 11.769 11.339 11.788 11.867 11.886 11.808 11.339 11.554 11.182)

jo vtg="$( jo -a "${value[@]}" )" |
jq '. += now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'

# or...

jo vtg="$( jo -a "${value[@]}" )" |
jq '. += { date: (now | strftime("%H:%M:%S") | split(":")) }'

Очевидно, что вы также можете создать раздел данных «на лету» с joчтением из команды date:

jo vtg="$(  jo -a "${value[@]}" )" \
   date="$( jo -a $( date +'%H %M %S' ) )"

Это зависит от того, что оболочка разделяет вывод dateна пробелы в строке формата. Вы получите местное время из приведенного выше.

Инструмент joдоступен в https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

.
4
28.07.2021, 11:24

Теги

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