271

How can we extract specific files from a large tar.gz file? I found the process of extracting files from a tar in this question but, when I tried the mentioned command there, I got the error:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

How do I then extract a file from tar.gz?

2
  • 1
    Note that any solution must first decompress the entire archive: superuser.com/questions/655739/… If you want to avoid that, you will need to use another format, such as zip. ZIP will give less compression however, as it compresses individual file separately: superuser.com/questions/1013309/… I wonder if there is a format that supports both speed and ability to extract a single file. Commented May 7, 2019 at 16:22
  • 1
    @CiroSantilliOurBigBook.com you could use the parallel version of bzip2 and gzip to speed things up: askubuntu.com/questions/62607/… Commented Feb 17, 2024 at 21:11

7 Answers 7

310

List the paths in tar:

tar -ztf test.tar.gz

Note the file name / path exactly as it is listed. e.g. If it says e.g. ./extract11, or some/bunch/of/dirs/extract11 that's what you have to use.

You can extract that file in this format:

tar -zxvf <tar filename> <file you want to extract>

The file the file will show up under exactly that name, needed directories are created automatically.


Options used:

  • -z: filter archive through gzip, use to decompress .gz files.
  • -t: List the contents of an archive
  • -x: instructs tar to extract files.
  • -v: Verbose (show progress while extracting files).
  • -f: specifies filename / tarball name.
6
  • $ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors Commented Jan 16, 2013 at 7:52
  • 2
    then try this tar tf archive.tar.gz | grep extract11.please check whether extract11 is in the archive or not Commented Jan 16, 2013 at 8:06
  • I would like to add a point here, the -z option doesn't work in some versions of unix like HP-UX. Commented Aug 26, 2015 at 6:54
  • 2
    @pj-brunet: No, f must not be at the end. But it must be directly followed by the filename. This example with all the other options after the tar name works fine: tar -f mytar.tar.gz -zxv dir/somefile. It extracts "dir/somefile" from "mytar.tar.gz". Commented Jan 13, 2019 at 22:06
  • 7
    Thanks a lot that was great. For viewing the filenames, I used vim <tar filename> and for coying the file into a specific directory, I had to use -C before the filename. that is : tar -zxvf <tar filename> -C <your custom dir> <file you want to extract>. hope this comes helpful to somebody out there Commented Nov 10, 2020 at 12:24
83

Let's assume you have a tarball called lotsofdata.tar.gz and you just know there is one file in there you want but all you can remember is that its name contains the word contract. You have two options:

Either use tar and grep to list the contents of your tarball so you can find out the full path and name of any files that match the part you know, and then use tar to extract that one file now you know its exact details, or you can use two little known switches to just extract all files that match what little you do know of your file name—you don't need to know the full name or any part of its path for this option. The details are:

Option 1

$ tar -tzf lotsofdata.tar.gz | grep contract

This will list the details of all files whose names contain your known part. Then you extract what you want using:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

You may need ./ in front of your path for it to work.

Option 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Up to you which you find easier or most useful.

4
  • tar -xzf lotsofdata.tar.gz <full path and filename from your list above> worked for me withour giving ./ at the start of full path Commented Apr 6, 2017 at 7:26
  • You might have to be patient with these, took a while... Also maybe it's obvious, but it's going to extract the full directory structure in the current directory, even if those directories don't exist yet. Commented May 28, 2018 at 3:20
  • 1
    BSD tar (at least on macOS) doesn't support the --wildcards option. I was able to still get similar behavior with -x -O *foo. *foo was the filename glob in my case, since I knew the file ended with foo. Commented Jul 31, 2018 at 14:16
  • Does any BSD utility support GNU-style long options or are these long options always a giveaway that you need the GNU version? Anyone knows? Commented Jul 29, 2024 at 14:56
26

I was trying to extract a couple hundred files from a tarball with thousands of files the other day. The files I need cannot be referenced by a single wildcard. So I googled and found this page.

However, none of tricks above seem good for my task. I ended up reading the man, and found this option --files-from, so my final solution is

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

and it works like a charm.

Update: The list file should have the same format as you would see from tar -tvf, otherwise you would not be able to extract any files.

10

Please find below the examples of extracting specific files from tar.gz file.

From local file:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

From remote URL:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
5

Your example works for me if you omit the braces

$ tar --extract --file=test.tar.gz extract11

If your file extract11 is in a subfolder, you should specify the path within the tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11
2
  • $ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors Commented Jan 16, 2013 at 7:51
  • Then obiously extract11 is not in the tar-file. Be sure that you need to provide the relative path. See edit Commented Jan 16, 2013 at 7:59
1

To extract only files matching a certain pattern:

for i in $(tar ztf test.tar.gz | grep 2021-01); do tar -xzvf test.tar.gz $i; done

For multiple patterns:

for i in $(tar ztf test.tar.gz | egrep '2021-01|2021-02|2021-03'); do tar -xzvf test.tar.gz $i; done
0

to extract only some files from a large archive, use bsdtar --fast-read from libarchive

example:

$ du -sh chromium-124.0.6367.60.tar.zstd
2.2G    chromium-124.0.6367.60.tar.zstd

$ time bsdtar --fast-read -x -f chromium-124.0.6367.60.tar.zstd -- source/DEPS

real    0m0.034s

in this case, this is fast because the file is at the beginning of the archive,
and with --fast-read, only the first match is extracted

$ tar tf chromium-124.0.6367.60.tar.zstd | grep -n -m1 source/DEPS
20:source/DEPS

gnu tar does not have the fast-read option, it will always scan the entire archive

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.