ImageGrid/Archive/media/img/my/work/compress-archive.sh
Alex A. Naanou 69bc6ccc2b now compression reports progress...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2025-03-13 01:09:59 +03:00

111 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# TODO make this runnable from anywhere...
# - prepend paths with './' only if local/relative
BASE_PATH=.
ARCH_BZIP2='bzip2 -v {}'
ARCH_GZIP='gzip -v {}'
# XXX should we cygpath -w all the inputs???
OS="$(uname -s)"
if [[ "$OS" =~ Linux.* ]] ; then
ARCH_FS='btrfs filesystem defragment -czstd -vf {}'
else
ARCH_FS='compact /c /exe:lzx {}'
fi
# default...
ARCH=$ARCH_FS
EXT=ARW
# HACK: this is here to avoid using windows find...
PATH=/bin:$PATH
printhelp(){
echo "Usage: `basename $0` [ARGUMENTS] [PATH]"
echo
echo "Arguments:"
echo " -h --help - print this help and exit."
echo
echo " -bz -bzip2 - use bzip2 to compress`[[ $ARCH == $ARCH_BZIP2 ]] && echo " (default)" || echo ""`."
echo " -gz -gzip - use gzip to compress`[[ $ARCH == $ARCH_GZIP ]] && echo " (default)" || echo ""`."
echo " -fs - use filesystem compression`[[ $ARCH == $ARCH_FS ]] && echo " (default)" || echo ""`."
echo
echo " -ext EXT - set file extension to compress (default: ${EXT})"
echo " NOTE: only one -ext is supported now".
echo
}
# process args...
while true ; do
case $1 in
-h|--help)
printhelp
exit
;;
# archivers...
-bz|--bzip2)
ARCH=$ARCH_BZIP2
shift
;;
-gz|--gzip)
ARCH=$ARCH_GZIP
shift
;;
-fs)
ARCH=$ARCH_FS
shift
;;
# extension to compress...
--ext)
EXT=$2
shift
shift
;;
*)
break
;;
esac
done
# get path...
if [ "$1" ] ; then
BASE_PATH=$1
fi
# check if archiver exists...
if ! which ${ARCH/ *} > /dev/null 2>&1 ; then
echo "$0: ${ARCH/ *}: command not found." >&2
exit 1
fi
# do the work...
#find "$BASE_PATH" -name \*.${EXT} -exec ${ARCH} \; \
# && echo done.
IFS=$'\n'
ARWs=($(find "$BASE_PATH" -name \*.${EXT}))
COUNT=${#ARWs[@]}
DONE=1
for f in "${ARWs[@]}" ; do
echo $f
printf 'Doing: %d/%d\r' $DONE $COUNT
eval "${ARCH/\{\}/\"$f\"}" > /dev/null
DONE=$((DONE + 1))
done
echo done.
# vim:set nowrap nospell :