54

I'm .taring some files with the path example/super_user/Output.*.

The resulting .tar looks like this:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

But I want the file to be like the following:

- Output.zip
- Output.xml
- Output.txt

Do you know how I can achieve this while still being in another directory?

2
  • Do make sure to avoid tarbombs with archives like that. Sep 30, 2014 at 12:36
  • tar --strip-components=1000 ?
    – Zaar Hai
    Sep 2, 2019 at 6:40

8 Answers 8

16

tar will preserve the file and folder structure so I don't think there's any way to instruct tar to flatten the hierarchy at creation time.

One workaround is to temporarily change directory, create the tar, then go back - a quick example below:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
52

If the directory 'example' is at the root of the filesystem, here's another way:

tar -C /example/super_user -cvf result.tar .

this will change directory to the point that you want to do the tar. The caveat is that if there are any subdirectories under /example/super_user, the directory structure will be preserved for these sub-directories.

3
  • 3
    This is the answer to the problem at hand. The mentioned caveat is not a problem in this case. All other answers are workarounds to account for variations to the problem.
    – joki
    Nov 30, 2016 at 10:05
  • 1
    That's indeed the solution to this question. The directory doesn't have to be the root, supposing the directory structure /home/u/foo/bar, working dir is /home/b, then tar -C foo/bar -cvf qiz.tar . works well. One caveat though, is that you can't use wildcards, i.e. tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log" or tar -C foo/bar -cvf qiz.tar "foo/bar/*.log" won't work.
    – bric3
    Sep 13, 2018 at 9:26
  • 2
    It should be noted that you can use -C multiple times in a single tar command if you need to add multiple files spread over multiple directories but still want the tar file to be flat.
    – zero298
    Apr 25, 2019 at 13:54
19

I've posted my answer here:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

repost (for lazy ppl)


This is ugly... but it works...

I had this same problem but with multiple folders, I just wanted to flat every files out. You can use the option "transform" to pass a sed expression and... it works as expected.

this is the expression:

's/.*\///g' (delete everything before '/')

This is the final command:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

10

To create a tar (ARCHIVE.tar) with all files from a directory (DIR), without any parent directory information (not even ./), you can use something like:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

You can play with the find to limit depth, select specific files, and many other things.

Good Luck!

2
  • I'm getting "find: -printf: unknown primary or operator" at OSX find command. Any tips?
    – TCB13
    Feb 3, 2013 at 15:55
  • -printf is a non standard command. Many of those only work with specific versions of find. Usually we mark those when answering a question on Super User (e.g. with "-blah is a Gnu extension and will not work everywhere").
    – Hennes
    Sep 19, 2014 at 11:36
3

I created a temp directory. And in the directory, created symbolic links to all of the files to the files to be included. Then I did tar -h -C . so that all the files (not links, but their content) are included in the archive with the desired name.

3

Another way to temporarily change the directory is to put the cd and tar commands inside the parenthesis ( ):

    (cd example/super_user; tar -cvf ../../result.tar *)

The advantage of this, is, that you will always implicitly pop back to the original directory when the block is done. Another advantage is that the use of the wildcard * in this instance, will match the filenames in the temporary directory. i.e. no need for pushd .. popd blocks or keeping track of where to cd back to.

Alternative to the above, there is a special cd - command which toggles/undoes the last change directory, e.g.

    cd example/super_user # change to a subdirectory
    tar -cvf ../../result.tar *
    cd - # undoes the change to the subdirectory
2

If those are the entire contents of the tarball then you can use GNU tar's --strip-components option to remove the 2 levels before the files.

2
  • I've only got the option --strip-path but using it won't change anything.
    – user36938
    Apr 18, 2011 at 7:12
  • This works when a single level stripping is required across all files.
    – rags
    May 29, 2021 at 6:13
0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd pushes the current directory path to the DIR stack and moves to content folder. Then, you move back to original directory by using popd.

You must log in to answer this question.