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:

  1. Extract .tar file from .tar.gz file:

    gunzip filename.tar.gz

  2. Update uncompressed .tar file with tar -u command:

    tar -uf filename.tar new_file

  3. 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