12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #! /bin/sh
- # Usage: tarcat volume1 volume2 ...
- # concatenates a GNU tar multi-volume archive into a single tar archive.
- # Author: Bruno Haible <[email protected]>, Sergey Poznyakoff <[email protected]>
- # Copyright 2004-2023 Free Software Foundation, Inc.
- # This file is part of GNU tar.
- # GNU tar 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 3 of the License, or
- # (at your option) any later version.
- # GNU tar 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 <http://www.gnu.org/licenses/>.
- # dump_type FILE [N]
- # Print type character from block N (default 0) of tar archive FILE
- dump_type() {
- dd if="$1" skip=${2:-0} bs=512 count=1 2>/dev/null |
- tr '\0' ' ' |
- cut -c157
- }
- case `dump_type "$1"` in
- [gx]) PAX=1;;
- esac
- cat "$1"
- shift
- for f
- do
- SKIP=0
- T=`dump_type "$f"`
- if [ -n "$PAX" ]; then
- if [ "$T" = "g" ]; then
- # Global extended header.... 2 blocks
- # Extended header........... 2 blocks
- # Ustar header.............. 1 block
- # FIXME: This calculation is will fail for very long file names.
- SKIP=5
- fi
- else
- if [ "$T" = "V" ]; then
- T=`dump_type "$f" 1`
- fi
- if [ "$T" = "M" ]; then
- SKIP=$(($SKIP + 1))
- fi
- fi
- dd skip=$SKIP if="$f"
- done
|