Extract multiple .tar.gz files with a single tar call
This is possible, the syntax is pretty easy:
$ cat *.tar | tar -xvf - -i
The -i option ignores the EOF at the end of the tar archives, from the man page:
-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
For *.tar.gz:
for file in *.tar.gz; do tar -zxf "$file"; done
For *.tar.bz2:
for file in *.tar.bz2; do tar -jxf "$file"; done
For *.tar.xz:
for file in *.tar.xz; do tar -Jxf "$file"; done
You need to use a loop. It wouldn't break the tar
command line syntax to allow multiple -f
options, but it would require adding code to process several archives in sequence, with all kinds of edge conditions (What happens if an archive in the middle is malformed? Can the archives use different compression mechanisms? Can you have multiple -C
options (GNU tar option to extract to a particular directory), too? What about -K (GNU tar option to start at a certain member name)? …).
One possibility avoiding a for
loop is to install and activate AVFS, a FUSE filesystem that provides transparent access to archives. Each archive /path/to/archive
doubles as a directory ~/.avfs/path/to/archive#
. If you want to match the archives with wildcards, there's a hurdle of adding that #
to a wildcard match; it can be done in zsh.
mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination