I ran into that problem today when I wanted to tar all files and directories in a specified directory. Doing the following is not enough because hidden files (ones starting with . won't be included):

tar -czvf ~/tarfile.tar.gz /path/to/dir/*

Then I thought of the following:

find /path/to/dir/* -execdir /bin/tar -czvf ~/tarfile.tar.gz '{}' +

But this is not sufficient. What if execdir has reached the command lien limits and needed to re-run the same command with the rest set of files found?

So I needed an option or some way to create the tar file if it doesn't exists. If exists, append to it. Tried to find a solution to this, but couldn't. Thought of -r option but didn't work because it requires the existence of an already created tar file.

Does this mean there is no way and one has to write a mini-script to get this logic done?


Just use tar czvf ~/tarfile.tar.gz /path/to/dir/ without "*" which prevents the files starting with a "." from being included.

If you want to update an existing tarfile.tar.gz (i.e. add more files to it), you will need a small hack to update it, because tar runs into trouble updating a "gzipped" file. This oneliner "unzips, updates and zips" the file or creates a new one.

[ -f tarfile.tar.gz ] && (gunzip tarfile.tar.gz; tar uf tarfile.tar /path/to/dir/; gzip tarfile.tar) || tar cvfz tarfile.tar.gz /path/to/dir/

The simplest option would be to use tar uf tarfile.tar /path/to/dir/ which creates the file or updates it. You will need to compress it manually afterwards (maybe copy it to a different location first).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.