How can I update a tar.gz file?
I have created a tar.gz file (using the GUI, not the command line). How can I update it with a command that new files are added and modified files are updated, too?
Solution 1:
You'd normally use the -u flag for this. From tar's man page:
-u, --update only append files newer than copy in archive
so this sequence will do what you need:
# First create the tar file. It has to be UNCOMPRESSED for -u to work
tar -cvf my.tar some-directory/
# ... update some files in some-directory
# ... add files in some-directory
# Now update only the changed and added files
tar -uvf my.tar some-directory/
# Compress if desired
gzip my.tar
For a slightly more detailed look, see here: http://www.gnu.org/software/tar/manual/html_node/how-to-update.html
Solution 2:
Solution / Workaround
You can not update compressed TAR archive (.tar.gz) in one step. But, if you have enough free space you can do this:
-
Extract .tar file from .tar.gz file:
gunzip filename.tar.gz
-
Update uncompressed .tar file with
tar -u
command:tar -uf filename.tar new_file
-
Compress the updated .tar file:
gzip filename.tar
Speedup
If you have multi-core CPU, I recommend to use pigz
instead of gzip
for extract and create .gz files. (pigz
is a multi-threaded implementation of gzip
)
Simply replace gzip
/gunzip
commands to pigz
/unpigz
.
Related manuals
- tar - The GNU version of the tar archiving utility
- pigz - compress or expand files
Solution 3:
If you want to update a particular file in *.tar.gz
file, just do the following:
Enter vi
from where the tar
file is available
/home>vi
For eg., if you want to modify simple.tar.gz which is under /home/test/
directory the:
/home/test>vi
And in the empty editor enter :n simple.tar.gz
and press Enter
you will get the list of folders and files move the cursor where u want to modify
And click Enter. It will shown the vi
editor of the particular file. Then i
option to change the file. After the successful change. Press Esc key and choose :wq
to write and quit the file. Then use :q
to come out of the file list.
Solution 4:
If you are going to do this repeatedly, an optimization can be:
if [[ -f my.tar.gz ]]; then
if [[ ! -f my.tar ]]; then
echo 'No tar, unzipping tar.gz'
gunzip my.tar.gz
fi
tar -uvf my.tar file1 file2 file_new
gzip -fk my.tar # This keeps a copy of the tar.
# -f --force overwrite existing .tar.gz
# -k --keep Keep the input file (.tar file)
else
tar -cvzf my.tar.gz file1 file2
fi