43
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?

2 Answers 2

58

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.

6
  • I read man tar. Didn't spot --strip-components. nice one May 30, 2010 at 6:25
  • 1
    tar-1.14 uses --strip-path, tar-1.14.90+ uses --strip-components. Maybe problem here? Jun 26, 2011 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.
    – ian
    Jul 22, 2014 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... Dec 4, 2018 at 20:14
  • 1
    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, 2020 at 13:24
24

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/'

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .