Script bkp.sh
Jump to navigation
Jump to search
#!/bin/sh
#
# NAME bkp.sh
# VERSION 2.8.1
# REQUIRED sh, awk, du, cut, lscpu, tar, gzip, bzip2, zip, xz, 7z
#
set -o errexit -o nounset
fn_show_usage()
{
echo "Create a backup using tar"
echo "Usage: "`basename $0`" [OPTION]... <object_to_backup> [destination_path]"
}
fn_show_help()
{
fn_show_usage
echo
echo " -h Show this help"
echo " -t, --tar Uses tar without compression"
echo " -g, --gzip Uses tar with gzip compression (default)"
echo " --gzipFast Uses tar with gzip compression"
echo " using fast compression"
echo " -j, --bzip2 Uses tar with bzip2 compression"
echo " -z, --zip Uses tar with zip compression"
echo " -x, --xz Uses tar with xz compression"
echo " -7, --7zip Uses tar with 7zip compression"
echo " --7lim Uses tar with 7zip compression"
echo " limit 7zip file size to 1GB"
echo " --7limFast Uses tar with 7zip compression"
echo " limit 7zip file size to 1GB"
echo " using fast compression"
}
####
# Default vars
####
POST_COMMAND="gzip"
EXT=".tar.gz"
STDOUT="true"
CORES=$(( $(lscpu | awk '/^Socket/{ print $2 }') * $(lscpu | awk '/^Core/{ print $4 }') ))
####
# Check
####
# from http://mywiki.wooledge.org/BashFAQ/035
while test $# -gt 0
do
case "$1" in
-h | -\? | --help )
fn_show_help
exit 0
;;
-t | --tar )
POST_COMMAND="cat"
EXT=".tar"
shift
;;
-g | --gzip ) # default
shift
;;
--gzipFast )
POST_COMMAND="gzip --fast"
EXT=".tar.gz"
shift
;;
-j | --bzip2 )
POST_COMMAND="bzip2"
EXT=".tar.bz2"
shift
;;
-z | --zip )
POST_COMMAND="zip - -r -q -"
EXT=".zip"
shift
;;
-x | --xz )
POST_COMMAND="xz -z"
EXT=".tar.xz"
shift
;;
-7 | --7zip )
POST_COMMAND="7z a -bso0 -bsp0 -si -t7z"
EXT=".tar.7z"
STDOUT="false"
shift
;;
--7lim )
POST_COMMAND="7z a -bso0 -bsp0 -si -t7z -v1g -m0=LZMA2 -mmt=${CORES}"
EXT=".tar.7z"
STDOUT="false"
shift
;;
--7limFast )
POST_COMMAND="7z a -bso0 -bsp0 -si -t7z -v1g -m0=LZMA2:d64k:fb32 -ms=8m -mmt=${CORES} -mx=3"
EXT=".tar.7z"
STDOUT="false"
shift
;;
*)
if test -z "${TARGET_PATH-}"
then
TARGET_PATH="$1"
elif test -z "${DEST_PATH-}"
then
DEST_PATH="$1"
else
TOO_MUCH_ARGUMENTS="true"
fi
shift
;;
esac
done
if test ! -z "${TOO_MUCH_ARGUMENTS-}"
then
echo "Error: too much arguments." >&2
fn_show_usage >&2
exit 1
fi
if test ! -e "${TARGET_PATH-}"
then
echo "Error: <object_to_backup> must be specified and must exists." >&2
fn_show_usage >&2
exit 2
fi
if test -z "${DEST_PATH-}"
then
DEST_PATH="."
elif test ! -d "${DEST_PATH}"
then
echo "Error: <destination_path> must exists." >&2
fn_show_usage >&2
exit 3
fi
####
# Execute
####
# define a name
TARGET_FILE=`echo ${TARGET_PATH} | awk 'BEGIN {FS="/"} {print $(NF)}'`
if test "${TARGET_FILE}" = ""
then # if $? is empty then "$1" end with /, so
TARGET_FILE=`echo ${TARGET_PATH} | awk 'BEGIN {FS="/"} {print $(NF-1)}'`
fi
DEST_FILE="${DEST_PATH}/bkp_${TARGET_FILE}_"`date +%Y-%m-%d`"${EXT}"
# add a timestamp if file alredy exist
if test -f "${DEST_FILE}"
then
DEST_FILE="${DEST_PATH}/bkp_${TARGET_FILE}_"`date +%Y-%m-%d_%H-%M-%S`"${EXT}"
fi
# compress
FROMSIZE=`du --block-size=1 --apparent-size --summarize "${TARGET_PATH}" | cut -f 1`
CHECKPOINT=$((FROMSIZE / 10240 / 50))
CHECKPOINTACTION=`printf 'ttyout=\b->'`
echo "Estimated: [==================================================]"
echo -n "Progess: [ "
if test "${STDOUT}" = "true"
then
tar -c --record-size=10240 --checkpoint="${CHECKPOINT}" --checkpoint-action="${CHECKPOINTACTION}" "${TARGET_PATH}" -f - | ${POST_COMMAND} > "${DEST_FILE}"
else
tar -c --record-size=10240 --checkpoint="${CHECKPOINT}" --checkpoint-action="${CHECKPOINTACTION}" "${TARGET_PATH}" -f - | ${POST_COMMAND} "${DEST_FILE}"
fi
test "$?" -ne 0 && { echo -e "\nError, exit." >&2 ; exit 4; }
printf "\b]\n"
# see the result
ls --color -hl "${DEST_FILE}"*
# End