Files
q-tools/files/archive-subfolders
2016-08-01 16:17:46 +03:00

120 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
VERSION="20160801"
function helpexit() {
BS=$( basename "$0" )
echo "Archive the subfolders of the current directory, version: $VERSION"
echo "Usage: $BS [-z/-n] [folder name(s)]"
echo " -z Compress. If not given, will ask action after archiving"
echo " -n No compression. Exit after TARchive"
echo " --rm Remove source folders after archival"
echo " folder name: If given, archive only the named folder(s)."
echo " If not, for loop over all folders in the current directory."
exit
}
function listfolders() {
find "$@" -mindepth $DEPTH -maxdepth $DEPTH -type d | sort
}
function fsize() {
echo -en "\e[2K\r"
[[ -z "$2" ]] || printf "%s -> " "$2"
printf "%s %s" "$( timeout 1 fastdu -h "$1" )" "$1"
}
function killtrap() {
kill "$PID" &>/dev/null
}
function exitokay() {
[[ "$REMOVE" -eq 1 ]] && { exit; }
echo -ne "\nIf all looks okay, delete source folders with: # rm -r "
for folder in "${REALFOLDERS[@]}"; do echo -n "'$folder' "; done
echo ''
exit
}
DEPTH=1
FOLDERS=( )
REMOVE=0
for ((i=1; i<=${#@}; i++)) {
[[ "${!i}" = "-h" ]] && helpexit
[[ "${!i}" = "--help" ]] && helpexit
[[ "${!i}" = "-n" ]] && { NOCOMPRESSION=1; continue; }
[[ "${!i}" = "-z" ]] && { COMPRESSION=1; continue; }
[[ "${!i}" = "--rm" ]] && { REMOVE=1; continue; }
[[ "${!i}" = "-"* ]] && helpexit
FOLDERS+=( "${!i%/}" )
DEPTH=0
}
[[ ${#FOLDERS[@]} -eq 0 ]] && FOLDERS+=( "." )
export IFS=$'\n'
REALFOLDERS=( $( listfolders "${FOLDERS[@]}" ) )
echo 'Existing files will be overwritten!'
[[ "$REMOVE" -eq 1 ]] && {
echo 'Source folders will be deleted!'
}
echo -n "Archive the following folders "
[[ "$NOCOMPRESSION" -eq 1 ]] && {
echo -n without compression;
} || {
[[ "$COMPRESSION" -eq 1 ]] && echo -n with gzip compression
}
echo ':'
for folder in "${REALFOLDERS[@]}"; do echo -n "'$folder', "; done | sed -e "s/..$//"
echo ""
echo '<ctrl-c> to quit'
read foo
IFS=" " read -a SLEEPS <<< '0.1 0.5 1 2 3 4 5'
trap killtrap 9 15
for d in "${REALFOLDERS[@]}"; do
printf "%s" $d
tar cvvf "$d.tar" "$d" > "$d.tar.lst" &
PID=$!
DU=$( nice fastdu -h "$d" & )
DUPID=$!
while kill -0 "$PID" &>/dev/null; do
[[ -f "$d.tar" ]] && fsize "$d.tar" "$DU"
[[ -f "$d.tar" ]] || { sleep 2; continue; }
for i in ${SLEEPS[@]}; do
sleep $i; kill -0 "$PID" &>/dev/null || break 2
printf .
done
IFS=" " read -a SLEEPS <<< '4 4 4 4'
done
fsize "$d.tar" "$DU"
kill -0 "$DUPID" &>/dev/null || kill "$DUPID" &>/dev/null
echo ''
if wait $PID; then
# tar exists okay
[[ "$REMOVE" -eq 1 ]] && {
echo Removing folder $d
which rm-progress &> /dev/null && rm-progress -f "$d"
[[ -d "$d" ]] && rm -r "$d"
}
fi
done
trap - 9 15
[[ "$NOCOMPRESSION" -eq 1 ]] && {
exitokay
}
[[ "$COMPRESSION" -eq 1 ]] || {
echo 'Proceed to compress? <ctrl-c> to quit'
read foo
}
echo 'Compressing..'
IFS=" " read -a SLEEPS <<< '0.1 0.5 1 2 3 4 5'
trap killtrap 9 15
for d in "${REALFOLDERS[@]}"; do
DU=$( fastdu "$d.tar" )
DUh=$( fastdu -h "$d.tar" )
cat "$d.tar" | pv -s $DU | gzip > "$d.tar.gz" && {
rm "$d.tar"
}
printf '\r\033[F'
fsize "$d.tar.gz" "$DUh"
printf '\033[0K\n'
done
exitokay