All pastes #1541535 Raw Edit

Minoru

public shellscript v1 · immutable
#1541535 ·published 2009-08-24 12:52 UTC
rendered paste body
#!/bin/sh## PacK script 2# Based on code by Zend (avaliable here: http://welinux.ru/post/1177), rewritten# by Minoru (eual [dot] jp [at] gmail [dot] com)## CHANGELOG# 2:#   + pv used for progres bar (idea by greatx:#       http://welinux.ru/post/1177/#cmnt18014)## TODO# ~ lzma support (idea by ragesteel: http://welinux.ru/post/1177/#cmnt17955)# ~ what if archive (or output file) already exist?# ~ need to exclude output files from $files variable# ~ add "--" option (all "-o" and "--help" placed after it will be ignored). And#   do not forget to add -- to all archivers else they will try to process#   "--help" and so in their own way, not as a files# NOTES:# +  on small files progress bar can show weird things (like 106%) when packing#    tar and so. It's okay, don't worry ;)# REQUIRED:# - tar# - pv# - bzip2# - gzip# - zip# - rar# - 7zhelp() {    echo "USAGE: `basename $0` --help | tar|tbz|tgz|bz2|gz|7z|zip|rar -o outfile file1 [file2 [file3 ...]]"    echo ""    echo "-o outfile  --  set name of archive to \"outfile\""    echo "--help      --  shows this help note"}parseargs () {    # parsing files and "-o" parameter    while [ -n "$1" ]    do        case "$1" in        "-o")            out="$2"            shift 2            ;;        "--help")            help            ;;        *)            if [ -z "$files" ]            then                files="\"$1\""            else                files="$files \"$1\""            fi                if [ -z "$out2" ]            then                out2="$1"            fi                shift            let "count++"            ;;        esac    done}# Initializing variablesformat="" # tar, tbz, tgz, bz and so onfiles="" # list of files to packcount=0 # amount of files given to scriptout="" # archive filenameout2="" # archive filename; used by tar, tbz and so when only one file given# checking for pvif command -v pv &>/dev/nullthen    pv_avaliable=trueelse    pv_avaliable=false    echo "Warning: pv not found. Please install it for displaying nice progress bars, speed and estimated time while packing."fi# Some arguments which you want to pass to archivatorsbzip2args="--best"gzipargs="--best"zipargs="-9"lzmaargs="-m0=lzma"rarargs="-m5"# Getting format of archiveformat="$1" && shift# Check parametersif [ -z "$format" ]then    echo "Specify archive format please. See `basename $0` --help for details."    exit 1else    if [ "$format" == "--help" ]    then        help        exit    fi    if [ -z "$*" ]    then        echo "Specify files to pack please. See `basename $0` --help for details."        exit 1    fifi# Real work starts here!case $format in    tar)        parseargs "$@"                if [ -z "$out" ]        then            if [ "$count" -eq "1" ]            then                out="$out2.tar"            else                out="`basename $(pwd)`.tar"            fi        fi                if [ $pv_avaliable == true ]        then            size=`eval du -b $files | tail -1 | grep -o '^[0-9]*'`            eval tar cf - $files | pv -s $size >"$out"        else            eval tar cvf "$out" $files        fi        ;;        tbz)        parseargs "$@"        if [ -z "$out" ]        then            if [ "$count" -eq "1" ]            then                out="$out2.tar.bz2"            else                out="`basename $(pwd)`.tar.bz2"            fi        fi                if [ $pv_avaliable == true ]        then            size=`eval du -b $files | tail -1 | grep -o '^[0-9]*'`            eval tar cf - $files | pv -s $size | bzip2 -c $bzip2args - >"$out"        else            eval tar cvf - $files | bzip2 -c $bzip2args - >"$out"        fi        ;;    tgz)        parseargs "$@"        if [ -z "$out" ]        then            if [ "$count" -eq "1" ]            then                out="$out2.tar.gz"            else                out="`basename $(pwd)`.tar.gz"            fi        fi                if [ $pv_avaliable == true ]        then            size=`eval du -b $files | tail -1 | grep -o '^[0-9]*'`            eval tar cf - $files | pv -s $size | gzip -c $gzipargs - >"$out"        else            eval tar cvf - $files | gzip -c $gzipgargs - >"$out"        fi        ;;            bz2)        if [ $pv_avaliable == true ]        then            while [ -n "$1" ]            do                pv "$1" | bzip2 -c $bzip2args - >"$1.bz2"                shift            done        else            while [ -n "$1" ]            do                bzip2 -c $bzip2args $1 >"$1.bz2"                shift            done        fi        ;;            gz)        if [ $pv_avaliable == true ]        then            while [ -n "$1" ]            do                pv "$1" | gzip -c $gzipargs - >"$1.gz"                shift            done        else            while [ -n "$1" ]            do                gzip -c $gzipargs $1 >"$1.gz"                shift            done        fi        ;;            zip)        parseargs "$@"        if [ -z "$out" ]        then            if [ "$count" -eq "1" ]            then                out="$out2.zip"            else                out="`basename $(pwd).zip`"            fi        fi                eval zip -qvR $zipargs "$out" $files        ;;    7z)        parseargs "$@"        if [ -z "$out" ]        then            if [ "$count" -eq "1" ]            then                out="$out2.zip"            else                out="`basename $(pwd).7z`"            fi        fi                eval 7z a $lzmaargs "$out" $files        ;;    rar)        parseargs "$@"        if [ -z "$out" ]        then            if [ "$count" -eq "1" ]            then                out="$out2.zip"            else                out="`basename $(pwd).rar`"            fi        fi                eval rar a -r $lzmaargs -- "$out" $files        ;;    *)        echo "'$format' isn't supported archive format. See `basename $0` --help for details."        ;;esac