diff --git a/lrztar b/lrztar index 4e5f7d7..34fb25a 100755 --- a/lrztar +++ b/lrztar @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) George Makrydakis 2009-2011 +# Copyright (C) George Makrydakis 2009-2011,2013 # Copyright (C) Con Kolivas 2011-2012 # A bash wrapper for Con Kolivas' excellent lrzip utility. For the time @@ -21,71 +21,108 @@ # along with this program. If not, see . function lrztar_local() { - local hv="lrztar wrapper for compressing/decompressing \ -whole directories with lrzip. -lrztar [lrzip options] will compress directory \ -to directory.tar.lrz -lrztar -d [lrzip options] will extract directory \ -from directory.tar.lrz -lrzuntar [lrzip options] will extract directory \ -from directory.tar.lrz -lrz[un]tar -h will display this help message -lrzip -h will display lrzip options" - local p=( "${@:1:$(($#-1))}" ) s="${!#}" vopt=("lrz") \ - v_w=0 v_S=0 v_D=0 v_p=0 v_q=0 v_L=0 \ - v_n=0 v_l=0 v_b=0 v_g=0 v_z=0 v_U=0 \ - v_T=0 v_N=0 v_v=0 v_f=0 v_d=0 v_h=0 \ - v_H=0 v_c=0 v_k=0 v_o=0 x= i= + local hv="\ +lrztar GNU/bash wrapper script for lrzip and tar input/output over directories. +Copyright (C) George Makrydakis 2009-2011,2013 +Copyright (C) Con Kolivas 2011,2012 + +Usage : lrztar [lrzip options] +Result: a lrzip tarball is produced. +Extras: when an lrzip tarball is used with -d, -O, it gets extracted: + + -h: will display this message. + -d: will decompress a lrzip tarball to current directory. + -O: will decompress a -d specified lrzip tarball to path. + -f: will force overwrites. + +Final : + - You can use the remaining options of lrzip as they were. + - lrzuntar is equivalent to lrztar [options] -d . + - This script exists because of how lrzip behaves. + - Beware the -f flag, it stands for what it says... +" + local p=("${@:1:$(($#-1))}") s="${!#}" vopt=("lrz") \ + v_w=0 v_S=0 v_D=0 v_p=0 v_q=0 v_L=0 \ + v_n=0 v_l=0 v_b=0 v_g=0 v_z=0 v_U=0 \ + v_T=0 v_N=0 v_v=0 v_f=0 v_d=0 v_h=0 \ + v_H=0 v_c=0 v_k=0 v_o=0 v_O=0 x= i="$(pwd)" which tar &> /dev/null \ || { printf "lrztar: no tar in your path\n"; return 1; } which lrzip &> /dev/null \ || { printf "lrztar: no lrzip in your path\n"; return 1; } which lrzcat &> /dev/null \ || { printf "lrztar: no lrzcat in your path\n"; return 1; } - while getopts w:OS:DqL:nlbgzUTN:p:vfo:dtVhHck x; do - [[ $x == [OtV] ]] && { + while getopts w:O:S:DqL:nlbgzUTN:p:vfo:d:tVhHck x; do + [[ $x == [tV] ]] && { printf "lrztar: invalid option for lrztar: %s\n" "$x"; return 1; } ((v_$x=${#vopt[@]})) - [ $x == S ] && vopt[${#vopt[@]}]="$OPTARG" + vopt[${#vopt[@]}]="$OPTARG" done [[ $(basename "$0") == lrzuntar ]] \ - && { v_d=1; p=( -d "${p[@]}"); } + && { ((v_d=${#vopt[@]})); vopt[${#vopt[@]}]="$s"; } { ! (($#)) || ((v_h)); } && { printf "%s\n" "$hv" return } - [[ ${s%/*} != $s ]] && i="${s%/*}/" || i="./" ((v_d)) && { - s="${s%/}" - s="${s##*/}" - i+="$s" - s="${s%.tar.lrz}" - [[ -e $i ]] || { - printf "lrztar: file does not exist: %s\n" "$i" + [[ -e ${vopt[v_d]} ]] || { + printf "lrztar: file does not exist: %s\n" "${vopt[v_d]}" return 1 } - - ! ((v_f)) && [[ -e $s ]] && { - printf "lrztar: $s exists, will not overwrite without -f option\n" - return 1 - } - lrzcat "${p[@]}" "$i" | tar x - x=$? + i+="/${vopt[v_d]##*/}" + i="${i%.tar.*}" + ((v_O)) && { + s="" + mkdir -p "${vopt[v_O]}" &> /dev/null + for x in ${!p[@]};do + [ "${p[x]}"x == "-O"x ] && { + p[x]= + p[$((x+1))]= + break; + } + done + i="${vopt[v_O]}" + } + ! ((v_f)) && [[ -d $i ]] && { + printf "lrztar: %s directory found, overwriting only with -f\n"\ + "$i" + return 1 + } + [ ! -z "$s" ] && { + lrzcat ${p[@]// /\\ } "$s" | tar x -C "$i" + x=$? + } || { + lrzcat ${p[@]// /\\ } | tar x -C "$i" + x=$? + } } || { - ((v_o)) || { - s="${s%/}"; - p+=( -o "${s##*/}.tar.${vopt[v_S]}"); - } + if ((v_o)); then + ! ((v_f)) && [[ -e ${vopt[$v_o]} ]] && { + printf "lrztar: %s exists, aborting\n" "${vopt[$v_o]}" + return 1 + } + else + s="${s%/}" + p+=( -o "${s##*/}.tar.${vopt[v_S]}"); + ! ((v_f)) && [[ -e ${s##*/}.tar.${vopt[v_S]} ]] && { + printf "lrztar: %s exists, aborting\n" \ + "${s##*/}.tar.${vopt[v_S]}" + return 1 + } + fi [[ -d $s ]] || { printf "lrztar: directory does not exist: %s\n" "$s" return 1 } - tar c "$s" | lrzip "${p[@]}" + ! ((v_f)) && [[ -e ${s##*/}.tar.${vopt[v_S]} ]] && { + printf "lrztar: file %s exists, aborting\n" "$s.tar.lrz" + return 1 + } + tar c "$s" | lrzip ${p[@]// /\\ } x=$? } - ! ((x)) && ((v_D)) && rm -rf "$s" &> /dev/null return $x }