#!/usr/bin/env bash
help_text="
NAME
pack - Compresses and converts files base64 to copy / paste into a command line session.
USAGE
pack [options] <filename(s)>
OPTIONS
-f|--force
Overwrite existing pack if one already exists.
-h|--help
Show help text.
-n|--name <name>
Specify a name from the pack file.
-s|--silent
Suppress terminal output.
DESCRIPTION
Compresses one or more files and converts these to base64 to copy and paste into a command
line session with commands to convert these back to the original file. The output is also
written to a file, the name of which can be specified using the -n option. If no name is
specified, for a single file the output is written to '<filename>.pack', for multiple files
the output is written to 'multi.pack'.
AUTHOR
mjnurse.github.io - 2020
"
help_line="Compresses and converts files base64 to copy and paste into a command line session"
web_desc_line="Compresses and converts files base64 to copy and paste into a command line session"
try="Try ${0##*/} -h for more information"
tmp="${help_text##*USAGE}"
usage=$(echo "Usage: ${tmp%%OPTIONS*}" | tr -d "\n" | sed "s/ */ /g")
line="-------------------------------------------------"; line="# $line$line"
silent_yn=n
force_yn=n
if [[ "$1" == "" ]]; then
echo "${usage}"
echo "${try}"
exit 1
fi
while [[ "$1" != "" ]]; do
case $1 in
-f|--force) # arg: Overwrite existing pack if one already exists.
force_yn=y
;;
-h|--help) # arg: Show help text.
echo "$help_text"
exit
;;
-n|--name) # arg: <name> Specify a name from the pack file.
shift
pack_name="$1"
;;
-s|--silent) # arg: Suppress terminal output.
silent_yn=y
;;
?*)
break
;;
esac
shift
done
if [[ $# == 1 ]]; then
pack_name="${pack_name:-${1}}.pack"
else
pack_name="${pack_name:-multi}.pack"
fi
if [[ -f $pack_name && $force_yn == n ]]; then
read -p "File '${pack_name}' already exists. Overwrite [yN]? " yn
if [[ "${yn,,}" != y ]]; then
exit
fi
fi
rm -f $pack_name
multi_yn=n
if [[ $# != 1 ]]; then
echo "$line" >> $pack_name
files="$( echo " $* " | sed 's/ pack / /g; s/ [^ ]*\.pack / /g; s/^ *//; s/ *$//;')"
echo "${files// /, }" | fold -w 88 -s \
| sed "1s/^/# CONTENTS: /; 2,99s/^/# /" >> $pack_name
multi_yn=y
fi
for f in $*; do
if [[ "$f" != "pack" && ! "$f" =~ .*pack ]]; then
if [[ $multi_yn == y ]]; then
echo "${line}" >> $pack_name
echo "# FILE: $f " >> $pack_name
echo "${line}" >> $pack_name
fi
echo "$(cat $f | gzip -f -9 | base64 -w 999999999 )" | sed "s/^/echo '/" \
| fold -w 100 >> $pack_name
echo "' | base64 -d | gunzip > $f; chmod u+x $f" >> $pack_name
fi
done
if [[ $silent_yn == n ]]; then
cat $pack_name
fi