#! /bin/bash set -e set -u set -E # (C) 2011,2013 Joerg Jaspert # GPLv2, no later LC_ALL=C export LC_ALL=C function dofslist () { case "$1" in *.lzma) ZCAT="lzma -dc" ;; *.xz) ZCAT="xz -dc" ;; *.bz2) ZCAT="bzip2 -dc";; *.gz) ZCAT="gzip -dc" ;; *.z) ZCAT="gzip -dc" ;; *.Z) ZCAT="gzip -dc" ;; *) ZCAT="cat" ;; esac if [[ ! -d ${EXTRACTTO} ]]; then mkdir -p "${EXTRACTTO}" $ZCAT "$1" | tar -C "${EXTRACTTO}" --extract -f - fi $ZCAT "$1" | tar tvvf - | while read MODE OWNER SIZE DATE TIME NAME LINK; do # Filter out directories. They would be empty anyways if [[ ${MODE} =~ ^d.* ]]; then continue fi OUTLINE="${MODE}" # permission string OUTLINE="${OUTLINE} 1" # number of links. definitely wrong right now OUTLINE="${OUTLINE} ${OWNER%%/*}" # file owner OUTLINE="${OUTLINE} ${OWNER##*/}" # file group OUTLINE="${OUTLINE} ${SIZE}" # file size if [[ ${DATE} =~ ([0-9]{4})-([0-9]{2})-([0-9]{2}) ]]; then DATE="${BASH_REMATCH[2]}-${BASH_REMATCH[3]}-${BASH_REMATCH[1]}" fi OUTLINE="${OUTLINE} ${DATE} ${TIME}" # file date/time # NAME=${NAME#*/} OUTLINE="${OUTLINE} ${NAME//\//\\}" # filename OUTLINE="${OUTLINE} " # filepath if [[ "${LINK}" =~ "^->.*" ]]; then OUTLINE="${OUTLINE} ${LINK}" fi echo ${OUTLINE} done } function docopyout () { case "$2" in *.lzma) ZCAT="lzma -dc" ;; *.xz) ZCAT="xz -dc" ;; *.bz2) ZCAT="bzip2 -dc";; *.gz) ZCAT="gzip -dc" ;; *.z) ZCAT="gzip -dc" ;; *.Z) ZCAT="gzip -dc" ;; *) ZCAT="cat" ;; esac NAME=${3//\\/\/} if [[ -f "${EXTRACTTO}/${NAME}" ]]; then cp "${EXTRACTTO}/${NAME}" "${4}" else $ZCAT "$2" | tar -xO "$NAME" > "$4" fi } ARCHIVEPATH=${2%/*} ARCHIVENAME=${2##*/} EXTRACTTO="${ARCHIVEPATH}/${ARCHIVENAME}.d" case "$1" in list) dofslist "$2" | sort -k 8; exit 0 ;; copyout) docopyout "$@" exit 0 ;; esac exit 1