tar Notes

By Greg Gallardo

Tape ARchive (tar) is a tool for archiving files. It's one of those utilities I use all of the time on Unix-like systems. Archiving is the process of combining multiple files into a single large file. As a system-administrator and a software developer, I make tarballs of projects, installations, uploaded file folders, etc several times a week.

Basic Usage

Options

OptionDescription
cCreate an new archive
xExtract files from an archive
tList the contents an archive
rAppend files to the end of an archive
fSet archive file
zgzip the archive
jbzip2 the archive
Cchange the directory before performing operations

Archive Creation and Extraction examples

Create archive file with the c option. the f option specifies the archive file

tar -c -f  uploads.tar /enc/uploads

tar cf  uploads.tar /enc/uploads

Adding v gives verbose output. This lets you see the paths as they get added to the archive.

tar cvf  uploads.tar /enc/uploads

Extract all contents from the archive file with the x option

tar xvf uploads.tar

You can list the contents of a archive file (without extracting) with the t option

tar tvf uploads.tar.bz2

You can specify which files to extract by adding their name to the file

tar xvf uploads.tar   some_file.txt  some_other_file.txt  *.jpg

You can compress the archive in gzip format with the z option

tar cvzf  uploads.tar.gz /enc/uploads

bzip2 can be used instead of gzip with with the j option

tar cvjf  uploads.tar.bz2 /enc/uploads

Modify Existing Archive Files

Use the r option to append new files to the archive. This will add the specified files the archive.

tar rvf  uploads.tar  new_file.txt

Use the r option to update existing files. This replaces the file that matches the one specified.

tar uvf  uploads.tar  update_file.txt

find

The output from find can be pipped into tar.

You can find all c files in a directory and combine them in an archive

find . -name "*.c" | tar cvf cfiles.tar -T -

Or if you want to archive all files found that are newer than 2 days

find . -mtime -2 -type f | tar cvf cfiles.tar -T -

Note you have to use -type f in the find command to prevent directories that may have been modified recently. If you don't, the archive will include all of the contents of the recently modified directories.

-maxdepth can be used to limit the how far find goes when looking for files.

find aruco/ -maxdepth 2 -name "*cpp" -o -name CMake* | tar cvf aruco.tar -T -

git

Like find the output from git can be used by tar.

You can find all c files in a directory and combine them in an archive

git diff -w --name-only 2>/dev/null | tar cvf git_diff.tar -T -


tar cvf git_diff.tar `git diff -w --name-only`

Wildcards

The wildcards option lets you pattern match the files you wish to list or extract from an archive.

tar tvf  MegaDriving.tar --wildcards 'MegaDriving/*/src/*c'

Alternate Destinations

Directory

You can tar files to another directory instead of an archive file. Setting the file as - lets you pipe the archive as its created to another tar command. The second tar command extracts from - into the folder selected by cd.

  tar cBf - srcFileOrDir | (cd /dest/dir/ ; tar xvpBf -)

Networked

You can also use OpenSSH to tar between different machines. You pipe the tar output to the machine over SSH. This example copies the files and directories to a destination directory on a remote host. The second tar command extracts the files to the destination directory.

  tar cBf - srcFileOrDir | ssh -C user@example.com   "cd /dest/dir/ ; tar xvBf - "

You can also create an archive file on the remote host instead of extracting from the stream. This example uses dd to create an archive file on a remote host.

tar cBf - DIR1 DIR2  | ssh   user@dest.example.com   dd of=/databak/DIR1_DIR2.tar