Search code examples
linuxarchivetargitignoreignore

Exclude directories from tar archive with a .tarignore file


In a similar way to .gitignore, is it possible to do that a .tarignore file in a subdirectory makes it excluded from archive when doing

tar cfjvh backup.tar.bz2 .

(I know the --exclude parameter of tar but here it's not what I want).


Solution

  • Using the --exclude-ignore=.tarignore option causes Tar to use .tarignore files in a similar way that git uses .gitignore files. Use the same syntax as you would usually use in .gitignore files, so if you want to ignore all sub-directories and files in a particular directory, add a .gitignore file with * to that directory. For example:

    $ find dir
    dir
    dir/a
    dir/b
    dir/c
    dir/dir1
    dir/dir1/1a
    dir/dir1/1b
    dir/dir2
    dir/dir2/2a
    dir/dir2/2b
    $ echo "*" > dir/dir1/.tarignore
    $ tar -c --exclude-ignore=.tarignore -vjf archive.tar.bz2 dir
    dir/
    dir/a
    dir/b
    dir/c
    dir/dir1/
    dir/dir2/
    dir/dir2/2a
    dir/dir2/2b
    

    If you want to ignore all directories that have an empty .tarignore file, take a look at the --exclude-tag-all=.tarignore option.

    $ find dir
    dir
    dir/a
    dir/b
    dir/c
    dir/dir1
    dir/dir1/1a
    dir/dir1/1b
    dir/dir2
    dir/dir2/2a
    dir/dir2/2b
    $ touch dir/dir1/.tarignore
    $ tar -c --exclude-tag-all=.tarignore -vjf archive.tar.bz2 dir
    tar: dir/dir1/: contains a cache directory tag .tarignore; directory not dumped
    dir/
    dir/a
    dir/b
    dir/c
    dir/dir2/
    dir/dir2/2a
    dir/dir2/2b
    

    Also take a look at the --exclude-tag= and --exclude-tag= options, which are variations which have slightly different behaviors.