28
tar -tf filename.tar
folder1/file
folder1/name
[...]

I'd like to extract file and name to, folder2. Can this be done as a one-liner?

37

Use -C and --strip-components (See man tar).

Example:

mkdir FOLDER
# for remote tar file
curl -L ’remote_tar_file' | tar -xz - -C FOLDER --strip-components=1

# for local tar file
tar -xzf FILENAME -C FOLDER --strip-components=1

Explanation:

The -C flag assumes a directory is already in place so the contents of the tar file can be expanded into it. hence the mkdir FOLDER.

The --strip-components flag is used when a tar file would naturally expand itself into a folder, let say, like github where it examples to repo-name-master folder. Of course you wouldn’t need the first level folder generated here so --strip-components set to 1 would automatically remove that first folder for you. The larger the number is set the deeper nested folders are removed.

| improve this answer | |
  • I read man tar. Didn't spot --strip-components. nice one – Felipe Alvarez May 30 '10 at 6:25
  • 1
    tar-1.14 uses --strip-path, tar-1.14.90+ uses --strip-components. Maybe problem here? – Mikhail Moskalev Jun 26 '11 at 7:42
  • I'd upvote this if it gave an example and not just the switches, as the online manual states, 3 argument styles give rise to confusion. – Iain Jul 22 '14 at 14:45
  • Forgot the -f on tar -xz, me thinks. Failed for me. I thought I'd been using that for no reason all this time... – John Carrell Dec 4 '18 at 20:14
  • When the output of curl is piped into tar, there should be no single hyphen parameter (i.e., instead of -xz - -C it should just read -xz -C). A single hyphen usually acts as a filename and refers to using stdin instead of a file, but without a -f tar already uses stdin without an explicit -. In fact, it does not expect any filename in this case and providing one (even -) will trigger an error. – Zoltan Jan 16 at 13:24
19

You can also use the --transform option for a bit more flexibility. It accepts any sed replacement (s) operation.

For example, this is how I extract a Linux tarball to a new directory so I can apply a patch:

tar -xjf linux-2.6.38.tar.bz2 --transform 's/linux-2.6.38/linux-2.6.38.1/'
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.