是否有一个简单的shell命令/脚本支持排除某些文件/文件夹的归档?

我有一个需要归档的目录,其中有一个子目录,其中有许多非常大的文件,我不需要备份。

不完全是解决方案:

tar——exclude=PATTERN命令匹配给定的模式并排除那些文件,但我需要忽略特定的文件和文件夹(完整的文件路径),否则有效的文件可能会被排除。

我还可以使用find命令创建一个文件列表,排除我不想存档的文件,并将该列表传递给tar,但这只适用于少量文件。我有成千上万。

我开始认为唯一的解决方案是创建一个包含要排除的文件/文件夹列表的文件,然后使用rsync with——exclude-from=file将所有文件复制到tmp目录,然后使用tar对该目录进行归档。

谁能想到更好/更有效的解决办法?

编辑:查尔斯·马的解决方案很有效。最大的问题是——exclude='。/folder'必须在tar命令的开头。完整命令(先cd,所以备份相对于该目录):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

当前回答

最好的方法是通过xargs(处理大量的参数)与tar一起使用find。例如:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

其他回答

为了避免可能的'xargs:参数列表太长'错误,由于使用find…| xargs…当处理成千上万的文件时,您可以使用find…将find的输出直接输送到tar。-print0 | tar——null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -

我没能让tar排除几层深的5gb子目录。最后,我只使用了unix Zip命令。这对我来说容易多了。

对于原始文章中的这个特殊例子 (沥青——排除= '。/文件夹”,排除= '。/upload/folder2' -zcvf /backup/filename. txtTGZ)

等价的是:

Zip -r /backup/filename.zip。-x upload/folder/**\* upload/folder2/**\* .使用实例

(注:这是我最初使用的帖子,帮助我https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t)

你也可以根据需要使用"——exclude-tag"选项:

——exclude-tag =文件 ——exclude-tag-all =文件 ——exclude-tag-under =文件

包含指定FILE的文件夹将被排除。

在阅读了所有这些不同版本的好答案并为自己解决了问题之后,我认为有一些非常重要的小细节,对于GNU/Linux的普遍使用来说是非常罕见的,这些细节没有得到足够的强调,值得更多的评论。

所以我不打算回答每个情况的问题,相反,试着记下当东西不工作的时候去哪里看。

注意这一点非常重要:

THE ORDER OF THE OPTIONS MATTER: it is not the same put the --exclude before than after the file option and directories to backup. This is unexpected at least to me, because in my experience, in GNU/Linux commands, usually the order of the options doesn't matter. Different tar versions expects this options in different order: for instance, @Andrew's answer indicates that in GNU tar v 1.26 and 1.28 the excludes comes last, whereas in my case, with GNU tar 1.29, it's the other way. THE TRAILING SLASHES MATTER: at least in GNU tar 1.29, it shouldn't be any.

在我的例子中,对于Debian扩展上的GNU tar 1.29,有效的命令是

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

引语不重要,不管有没有引语都有用。

我希望这对一些人有用。

对于那些有问题的人来说,有些版本的tar只有在没有'的情况下才能正常工作。排除值中的/'。

Tar --version

电线(飞)1.27.1

适用的命令语法:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

这些都不起作用:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *