#!/bin/sh # # # Author: Bernhard Kuehl # Universitaet Osnabrueck # Mon Jun 16 16:47:35 MET DST 1997 # File: extractArchive # Description: # Restauriert Dateien mit Daten und Zugriffsrechten # aus einem Archiv , welches von makeArchiv erzeugt # worden ist. # # Bugs: - read x liefert Zeilen die mit \ fortgesetzt werden als eine Zeile! # - Dateien mit Namen "a b c" oder "a " machen Probleme # - t- und s-Bits werden nicht restauriert # PATH=/usr/local/bin:/usr/local/gnu/bin:/usr/ucb:/usr/bin:/etc export PATH usage () { echo usage: `basename $0` file >&2 exit 1 } fatal() # message { echo >&2 "$@" exit 1 } # extract start_line --- start_line + #line - 1 extract() # start_line #lines output-file { START=$2 END=`expr $2 \+ $3 \- 1` cat $1 | sed -n ${START},${END}p > "$4" } # set mode of $2 set_mode() # $MODE $NAME { USER=`echo $MODE | sed 's/-\(...\).*/\1/' | sed 's/-//g'` GROUP=`echo $MODE | sed 's/-...\(...\).*/\1/' | sed 's/-//g'` OTHER=`echo $MODE | sed 's/-......\(...\).*/\1/'| sed 's/-//g'` chmod u=$USER $2 chmod g=$GROUP $2 chmod o=$OTHER $2 } case "$#" in 1) INPUT="$1" [ -f "$INPUT" -a -r "$INPUT" ] || fatal "can't open $INPUT" LINE_WAS=3 [ -r "$INPUT" ] || fatal "`basename $0`: can't read $INPUT" cat "$INPUT" | { while read ll # read ... do set -- $ll; MODE=$1;NAME=$9 echo processing $NAME >&2 read wc # read wc info set $wc; LINES=$1 > "$NAME" zaehler=1 while [ $zaehler -le $LINES ] do read x zaehler=`expr $zaehler \+ 1` done [ $LINES != 0 ] && extract $INPUT $LINE_WAS $LINES "$NAME" set_mode $MODE "$NAME" LINE_WAS=`expr $LINES \+ $LINE_WAS \+ 2` done } break ;; *) usage esac exit 0