Tar a directory, but don't store full absolute paths in the archive
tar -cjf site1.tar.bz2 -C /var/www/site1 .
In the above example, tar will change to directory /var/www/site1
before doing its thing because the option -C /var/www/site1
was given.
From man tar
:
OTHER OPTIONS
-C, --directory DIR
change to directory DIR
The option -C
works; just for clarification I'll post 2 examples:
creation of a tarball without the full path: full path
/home/testuser/workspace/project/application.war
and what we want is justproject/application.war
so:tar -cvf output_filename.tar -C /home/testuser/workspace project
Note: there is a space between
workspace
andproject
; tar will replace full path with justproject
.extraction of tarball with changing the target path (default to
.
, i.e current directory)tar -xvf output_filename.tar -C /home/deploy/
tar
will extract tarball based on given path and preserving the creation path; in our example the fileapplication.war
will be extracted to/home/deploy/project/application.war
./home/deploy
: given on extract
project
: given on creation of tarball
Note : if you want to place the created tarball in a target directory, you just add the target path before tarball name. e.g.:
tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project
Seems -C
option upto tar v2.8.3 does not work consistently on all the platforms (OSes). -C
option is said to add directory to the archive but on Mac and Ubuntu it adds absolute path prefix inside generated tar.gz file.
tar target_path/file.tar.gz -C source_path/source_dir
Therefore the consistent and robust solution is to cd
in to source_path (parent directory of source_dir) and run
tar target_path/file.tar.gz source_dir
or
tar -cf target_path/file.tar.gz source_dir
in your script. This will remove absolute path prefix in your generated tar.gz file's directory structure.