55 lines
1.4 KiB
Bash
Executable File
55 lines
1.4 KiB
Bash
Executable File
#!/bin/sh
|
|
set -f
|
|
|
|
if command -V gzip >/dev/null ; then has_gzip=1 ; fi
|
|
if command -V brotli >/dev/null ; then has_brotli=1 ; fi
|
|
if command -V zstd >/dev/null ; then has_zstd=1 ; fi
|
|
|
|
do_gzip() { [ -s "$1.gz" ] || gzip -1kf "$1" || return ; comp_fixup "$1" "$1.gz" || rm -f "$1.gz" ; }
|
|
do_brotli() { [ -s "$1.br" ] || brotli -1kf "$1" || return ; comp_fixup "$1" "$1.br" || rm -f "$1.br" ; }
|
|
do_zstd() { [ -s "$1.zst" ] || zstd -q1kf "$1" || return ; comp_fixup "$1" "$1.zst" || rm -f "$1.zst" ; }
|
|
|
|
float_div() {
|
|
mawk -v "a=$1" -v "b=$2" 'BEGIN{print a/b;exit;}' </dev/null
|
|
}
|
|
|
|
comp_fixup() {
|
|
[ -f "$1" ] || return 1
|
|
size1=$(env stat -Lc '%s' "$1") || return 1
|
|
[ -n "${size1}" ] || return 1
|
|
[ "${size1}" != 0 ] || return 1
|
|
|
|
[ -f "$2" ] || return 1
|
|
size2=$(env stat -c '%s' "$2") || return 1
|
|
[ -n "${size2}" ] || return 1
|
|
[ "${size2}" != 0 ] || return 1
|
|
|
|
ratio=$(float_div "${size2}" "${size1}") || return 1
|
|
case "${ratio}" in
|
|
[0-9]*e-[0-9]* )
|
|
## doubtful but okay (c) Oleg Tinkov
|
|
;;
|
|
0.[0-8]* | 0.90* )
|
|
## compression ratio below 90% is fine
|
|
;;
|
|
* ) return 1 ;;
|
|
esac
|
|
|
|
return 0
|
|
}
|
|
|
|
for i ; do
|
|
[ -n "$i" ] || continue
|
|
|
|
case "$i" in
|
|
*.br | *.gz | *.zst ) continue ;;
|
|
esac
|
|
|
|
[ -f "$i" ] || continue
|
|
[ -s "$i" ] || continue
|
|
|
|
[ -z "${has_gzip}" ] || do_gzip "$i"
|
|
[ -z "${has_brotli}" ] || do_brotli "$i"
|
|
[ -z "${has_zstd}" ] || do_zstd "$i"
|
|
done
|