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?
4 Answers
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
- 34,802
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.gzUpdate uncompressed .tar file with
tar -ucommand:tar -uf filename.tar new_fileCompress 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
- 614
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.
- 15,174
- 71
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
- 1,148