#!/bin/bash # 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 # being, lrzip does not like pipes, so we had to do this. It is kind of # self - documenting, spawned out of a test tube bash shell script. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . function lrztar_local() { 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. Notice: - The input argument is always last, all options and their arguments precede. - The -O flag is an option flag, goes before: (-O ). - 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: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[@]})) vopt[${#vopt[@]}]="$OPTARG" done [[ $(basename "$0") == lrzuntar ]] \ && { ((v_d=${#vopt[@]})); vopt[${#vopt[@]}]="$s"; } { ! (($#)) || ((v_h)); } && { printf "%s\n" "$hv" return } ((v_d)) && { [[ -e ${vopt[v_d]} ]] || { printf "lrztar: file does not exist: %s\n" \ "${vopt[v_d]}" return 1 } i+="/${vopt[v_d]##*/}" i="${i%.tar.*}" if ((v_O)); then for x in ${!p[@]};do [[ ${p[x]} == "-O" ]] && { p[x]= p[$((x+1))]= break; } done i="${vopt[v_O]%/}" x="${s##*/}" if [[ -d "$i/${x%.tar.*}" ]] && ! ((v_f)); then printf "lrztar: %s exists, use -f.\n" \ "$i/${x%.tar.*}" return 1 fi if ! [[ -d $i ]]; then printf "lrztar: %s output path does not exist.\n" \ "$i" return 1 fi else i="./" fi [ ! -z "$s" ] && { lrzcat ${p[@]// /\\ } "$s" | tar x -C "$i" x=$? } || { lrzcat ${p[@]// /\\ } | tar x -C "$i" x=$? } } || { if ((v_o)); then ! ((v_f)) && [[ -e ${vopt[$v_o]} ]] && { printf "lrztar: %s exists, use -f to overwrite.\n" \ "${vopt[$v_o]}" return 1 } else if ((v_O)); then if ! [[ -d ${vopt[v_O]} ]]; then printf "lrztar: %s output path does not exist.\n" \ "${vopt[v_O]}" return 1 fi for x in ${!p[@]};do [[ ${p[x]} == "-O" ]] && { p[x]= i="${p[$((x+1))]%/}" p[$((x+1))]= s="${!#}" break; } done fi s="${s%/}" p+=(-o "$i/${s##*/}.tar.${vopt[v_S]}"); fi ! ((v_f)) && [[ -e $i/${s##*/}.tar.${vopt[v_S]} ]] && { printf "lrztar: %s exists, use -f to overwrite\n" \ "$i/${s##*/}.tar.${vopt[v_S]}" return 1 } tar c "$s" | lrzip ${p[@]// /\\ } x=$? } return $x } lrztar_local "${@}"