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
}