How do I use tar to exclude all files of a certain directory?
A client uploads files to a development server. When it's time to upload the project to a production server, those files are no longer needed, and we'd like to exclude them from the tar file we'll eventually push to production. However, we still want to keep the directory in tact, it's only the files that are not needed
Using Ubuntu 16 and tar 1.28, we've tried:
tar -vczf archive.tar.gz . --exclude=wp-content/uploads/wpallimport/files/*
tar: Cowardly refusing to create an empty archiveWe've also tried enclosing exclude= parameter in single and double quotations, no luck.
tar -vczf archive.tar.gz . --exclude='wp-content/uploads/wpallimport/files/*'
tar: Cowardly refusing to create an empty archiveThe official website shows --exclude without equals sign
tar -vczf file.tar.gz --exclude 'directory/*' . and gives the same error.
How is this done?
24 Answers
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 filesthen
$ 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/file3fails 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/ABCIf 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.
Put directories you don't want (for example dir_A and dir_B) in a file:
echo dir_A > FILE
echo dir_B >> FILE
tar -cvf file_name.tar --exclude-from=FILE directory/ 0