Compare commits

...

2 Commits

Author SHA1 Message Date
Dan Church 44308e890f
Check qpdf is available before starting 2023-04-21 10:50:16 -05:00
Dan Church 7da19cfaf3
Use numfmt instead of custom byte-counting 2023-04-21 10:48:12 -05:00
1 changed files with 23 additions and 37 deletions

60
optipdf
View File

@ -105,6 +105,22 @@ if [[ ${#FILES[@]} -eq 0 ]]; then
exit 2
fi
check_required_binaries() {
local BIN MISSING=()
for BIN; do
if ! type -t "$BIN" &>/dev/null; then
MISSING+=("$BIN")
fi
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
printf 'Error: You are missing required programs:\n' >&2
for BIN in "${MISSING[@]}"; do
printf -- '- %s\n' "$BIN" >&2
done
exit 2
fi
}
file_size() {
stat \
--format='%s' \
@ -116,43 +132,10 @@ file_size() {
# produces a human-readable size from the byte count passed to it
hr_size() (
declare -i BYTES=$1
#UNITS=(B KB MB GB TB PB EB ZB YB) # shell math can only go so far...
UNITS=(B KB MB GB TB)
FACT=1024
THRESH=9/10
DECIMALS=1
DECIMALS_FACTOR=$(( 10 ** DECIMALS ))
# cycle through units from largest to smallest, exiting when it finds the
# largest applicable unit
for (( EXP = ${#UNITS[@]} - 1; EXP > -1; --EXP )); do
# check if the unit is close enough to the unit's size, within the
# threshold
if [[ $BYTES -gt $((FACT ** EXP * $THRESH)) ]]; then
# we found the applicable unit
# must multiply by a factor of 10 here to not truncate
# the given number of decimal places after the point
HR_VAL=$(( BYTES * DECIMALS_FACTOR / FACT ** EXP ))
# put the decimal point in
if [[ $DECIMALS -gt 0 ]]; then
HR_VAL=$(( HR_VAL / DECIMALS_FACTOR )).$(( HR_VAL % DECIMALS_FACTOR ))
fi
HR_UNIT=${UNITS[$EXP]}
break
fi
done
if [[ -z $HR_UNIT ]]; then
HR_VAL=$BYTES
HR_UNIT=${UNITS[0]}
fi
printf '%g %s\n' "$HR_VAL" "$HR_UNIT"
numfmt \
--to=iec \
--suffix=B \
"$@"
)
setup_tempdir() {
@ -233,6 +216,9 @@ use_smaller() {
}
check_required_binaries \
qpdf
QPDF_ARGS=(
--compression-level=9
--deterministic-id