[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: A silly question about tar



On Thu, Mar 15, 2007 at 02:59:01AM EST, Adam Porter wrote:
> I've read the man page, googled this list and the rest of the Net, but I
> still can't figure out why this doesn't work:
> 
> $ tar xjf *.tar.bz2
> tar: beryl-core-0.2.0.tar.bz2: Not found in archive
> tar: beryl-manager-0.2.0.tar.bz2: Not found in archive
> tar: beryl-plugins-0.2.0.tar.bz2: Not found in archive
> tar: beryl-plugins-unsupported-0.2.0.tar.bz2: Not found in archive
> tar: beryl-settings-0.2.0.tar.bz2: Not found in archive
> tar: beryl-settings-bindings-0.2.0.tar.bz2: Not found in archive
> tar: beryl-settings-simple-0.2.0.tar.bz2: Not found in archive
> tar: emerald-0.2.0.tar.bz2: Not found in archive
> tar: emerald-themes-0.2.0.tar.bz2: Not found in archive
> tar: heliodor-0.2.0.tar.bz2: Not found in archive
> tar: Error exit delayed from previous errors
> 
> Not only did it completely fail, but it skipped the first file in the
> directory, aquamarine-0.2.0.tar.bz2.  But if I run the same command on a
> single file instead of a wildcard, it works fine.
> 
> Am I doing something wrong?  Why can't tar handle a wildcard list like that?

compare ..

$ tar xjf a.tar.bz2                 # extract all files 
$ tar xjf a.tar.bz2 f1.txt f2.txt   # extract f1.txt & f2.txt
$ tar xjf a.tar.bz2 *.txt           # extract list of *.txt files  (1)
$ tar xjf a.tar.bz2 '*.txt'         # extract files matching *.txt (2)

Note that in (1) the shell expands the unquoted *.txt to the list of
files in the current directory that match *.txt and passes this list to
tar .. while in (2) the shell does not "see" the wild card and passes
the *.txt pattern to tar without expanding it.

So in your above scenario, it does not "skip" the first file .. The
shell expands the *.tar.bz2 pattern to aquamarine, beryl-core,
beryl-manager ..  and tar looks in aquamarine for files beryl-core ..
beryl-manager .. etc.  and naturally does not find them in the archive.

I rarely need to extract the entire contents of several tar archives in
one pass but something like this should work:

$ for t in $(ls *.tar.bz2); do tar xjf $t; done

Note that, to avoid file system pollution it is probably a good idea to
get into the habit of verifying what your extraction commands exactly
do by first issuing a "tar tjvf" and reviewing the output.

HTH

Thanks,
cga





Reply to: