#!/bin/bash
#                       /usr/local/bin/back2sd
# https://crystalfaeries.net/posix/bin/back2sd
# celeste@crystalfaeries.net	BACK2SD Wed 26 Jun 2019 09:03:55 AM HST

# required first argument is the path to the target directory
case "${#}" in
0)	# no arguments
	echo "$0 backs-up the core of crystalfaeries.net"
	echo "to the directory targeted by the argument you provide,"
	echo "( absolute path recommended, e.g. one from /media/* )"
	df	-h	|	head -n 1
	df	-h	|	grep /media/
	exit	0	#	maybe it should do some nice default or auto function vs error out
	;;

1)	# correct target path we hope
	cd $HOME/crystalfaeries.net/ || exit -1	# there is no place like Om Page
	date >	$HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt	# reset logfile

	for f in $(find . -maxdepth 1 -mindepth 1 \! -type d | sort)
	do	# copy the loose files at top level
	cp -au  "${f}"   "${1}" |& tee -a $HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt\
	|| echo "cp: $? $f"	|& tee -a $HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt
	done

	for d in $(find . -maxdepth 1 -mindepth 1 -type d \! -name lost+found \! -name audio | sed 's/^\.\///' | xargs du -s | sort -n | cut -f2-)
	do	# copy the directories except audio by increasing size
		 cp -au "${d}" "${1}" |& tee -a $HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt\
		|| exit "${?}"
	done

	cd audio || exit 2	# now do audio by size
	mkdir -p   		"${1}"/audio	# just in case

	for f in $(find . -maxdepth 1 -mindepth 1 \! -type d | sort)
	do	# copy the loose files at top level
		 cp -au "${f}" "${1}/audio" |& tee -a $HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt\
		 || echo "cp: $? $f" |& tee -a $HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt
	done

	for d in $(find . -maxdepth 1 -mindepth 1 -type d | sed 's/^\.\///' | xargs du -s | sort -n | cut -f2-)
	do	# copy the directories by increasing size
		cp -au "${d}" "${1}/audio"	|& tee -a $HOME/crystalfaeries.net/src/.back2sd.$(basename ${1}).txt\
		|| exit "${?}"
	done

	exit "${?}"
	;;

*)	# recursive resolution, depth first
	shift
	exec ${0} "${@}"
	exit	2	#	methought exec 'sposedto' never return
	;;

esac
exit "${?}"

