Самый простой метод для преобразования размера файла с суффиксом в байтах

В Title все сказано, но в настоящее время я использую простую функцию с оператором case для преобразования понятных человеку строк размера файла в размер в байтах. Это работает достаточно хорошо, но это немного громоздко для переноса в другой код, поэтому мне любопытно узнать, есть ли какие-либо широко доступные команды, которые вместо этого может использовать скрипт оболочки?

В основном я хочу взять такие строки, как «100g» или «100gb» и преобразовать их в байты.

В настоящее время я делаю следующее:

to_bytes() {
    value=$(echo "$1" | sed 's/[^0123456789].*$//g')
    units=$(echo "$1" | sed 's/^[0123456789]*//g' | tr '[:upper:]' '[:lower:]')

    case "$units" in
        t|tb)   let 'value *= 1024 * 1024 * 1024 * 1024'    ;;
        g|gb)   let 'value *= 1024 * 1024 * 1024'   ;;
        m|mb)   let 'value *= 1024 * 1024'  ;;
        k|kb)   let 'value *= 1024' ;;
        b|'')   let 'value += 0'    ;;
        *)
                value=
                echo "Unsupported units '$units'" >&2
        ;;
    esac

    echo "$value"
}

Кажется, это немного излишне для чего-то, что, как я думал, было довольно распространено для скриптов, работающих с файлами; достаточно часто, что-то может существовать, чтобы сделать это быстрее.

Если бы не было широко доступных решений (т. Е. Большинства разновидностей Unix и Linux), я все равно буду рад любым советам по оптимизации вышеупомянутой функции, поскольку я хотел бы сделать ее меньше и проще для повторного использования.

Ответы на вопрос(6)

Ваш ответ на вопрос