How do I use tar to exclude all files of a certain directory?
The usual gotcha with tar
's --exclude
option is that it is relative to the directory argument e.g. given
$ tree dir
dir
└── subdir
└── subsubdir
├── file1
├── file2
└── file3
2 directories, 3 files
then
$ tar cvf dir.tar.gz --exclude='/dir/subdir/subsubdir/*' dir
dir/
dir/subdir/
dir/subdir/subsubdir/
dir/subdir/subsubdir/file1
dir/subdir/subsubdir/file2
dir/subdir/subsubdir/file3
fails to exclude the contents of subsubdir
(it's trying to exclude dir/dir/subdir/subsubdir/*
, which doesn't match anything); what you want is
$ tar cvf dir.tar.gz --exclude='subdir/subsubdir/*' dir
dir/
dir/subdir/
dir/subdir/subsubdir/
AFAIK the order doesn't matter except that the output file must immediately follow the f
option.
Let's say you have a directory named "top-dir" with subfolders "dir/subdir". If you want to exclude content of a directory "dir/subdir" but not the directory itself, the command line that actually works is tar -zcp --exclude='dir/subdir/*' -f archive.tgz top-dir
.
You have to use the -f
switch after the --exclude
one and before the archive file name.
Success Case:
-
If giving full path to take backup, in exclude also should be used full path.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude='/opt/ABC/csv/*' --exclude='/opt/ABC/log/*' /opt/ABC
-
If giving current path to take backup, in exclude also should be used current path only.
tar -zcvf backup_27032020.tar.gz --exclude='ABC/csv/*' --exclude='ABC/log/*' ABC
Failure Case:
-
If giving currentpath directory to take backup and full path to ignore,then it won't work
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude='/opt/ABC/csv/*' --exclude='/opt/ABC/log/*' ABC
Note: mentioning exclude before/after backup directory is fine.