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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You can also use tar -zxvf <tar filename> <file you want to extract>
You must write the file name exacty as tar ztf test.tar.gz shows it. If it says e.g. ./extract11, or some/bunch/of/dirs/extract11, that’s what you have to give (and the file will show up under exactly that name, needed directories are created automatically).
-x: instructs tar to extract files.-f: specifies filename / tarball name.-v: Verbose (show progress while extracting files).-z: filter archive through gzip, use to decompress .gz files.-t: List the contents of an archive
Method 2
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.
Method 3
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.
Method 4
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
Method 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
Method 6
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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0