untar   [plain text]


#! /bin/bash
#
# original from:
# @(#) untar.ksh 1.0 93/11/10
# 92/10/08 john h. dubois iii (john@armory.com)
# 92/10/31 make it actually work if archive isn't in current dir!
# 93/11/10 Added pack and gzip archive support
#
# conversion to bash v2 syntax done by Chet Ramey

phelp()
{
echo \
"$name: extract tar archives into directories, uncompressing if neccessary.
Usage: $name archive[.tar[.[Z|gz]]] ..
If an archive name given does not end in .tar, .tar.Z, or .tar.gz, it is
searched for first with .tar added, then .tar.Z, and then .tar.gz added. 
The real filename must end in either .tar, .tar.Z, or .tar.gz.  A
directory with the name of the archive is created in the current directory
(not necessarily the directory that the archive is in) if it does not
exist, and the the contents of the archive are extracted into it. 
Absolute pathnames in tarfiles are suppressed."
}

if [ $# -eq 0 ]; then
    phelp
    exit 1
fi

name=${0##/}
OWD=$PWD

for file; do
    cd $OWD
    case "$file" in
    *.tar.Z)	ArchiveName=${file%%.tar.Z} zcat=zcat;;
    *.tar.z)	ArchiveName=${file%%.tar.z} zcat=pcat;;
    *.tar.gz)	ArchiveName=${file%%.tar.gz} zcat=gzcat;;
    *)	ArchiveName=$file
	for ext in "" .Z .z .gz; do
	    if [ -f "$file.tar$ext" ]; then
		file="$file.tar$ext"
		break
	    fi
	done
	if [ ! -f "$file" ]; then
	    echo "$file: cannot find archive." 1>&2
	    continue
	fi
	;;
    esac
    if [ ! -r "$file" ]; then
	echo "$file: cannot read." >&2
	continue
    fi
    DirName=${ArchiveName##*/}
    [ -d "$DirName" ] || {
	mkdir "$DirName" || {
		echo "$DirName: could not make archive directory." 1>&2
		continue
	}
    }

    cd $DirName || {
	echo "$name: cannot cd to $DirName" 1>&2
	continue
    }

    case "$file" in
    /*)	;;
    *) file=$OWD/$file ;;
    esac

    echo "Extracting archive $file into directory $DirName..."
    case "$file" in
    *.tar.Z|*.tar.z|*.tar.gz) $zcat $file | tar xvf -;;
    *.tar) tar xvf $file;;
    esac
    echo "Done extracting archive $file into directory $DirName."
done