如何在OSX上使用TAR排除目录?

13

这是我在我的MacOSX机器上的当前目录结构:

kuli at fumpenwuppich in /volume/workspace on master [!?$]
$ ls -l
total 0
drwxr-xr-x   4 kuli  staff  136 Nov 28 16:02 conf
drwxr-xr-x   3 kuli  staff  102 Nov 28 16:23 html
drwxr-xr-x   3 kuli  staff  102 Nov 28 13:06 legacy
drwxr-xr-x  11 kuli  staff  374 Nov 28 15:41 vagrant.nginx

我想创建一个.tar.bz2的备份文件,但不包含子目录 'legacy'。

我尝试过多种方法:

tar cfjv --exclude 'legacy' ~/Dropbox/backup/kuli.20151128.tar.bz2 .
tar cfjv --exclude='legacy' ~/Dropbox/backup/kuli.20151128.tar.bz2 .
tar cfjv ~/Dropbox/backup/kuli.20151128.tar.bz2 --exclude legacy .
tar cfjv ~/Dropbox/backup/kuli.20151128.tar.bz2 --exclude=legacy .
tar cfjv ~/Dropbox/backup/kuli.20151128.tar.bz2 --exclude='legacy' .
tar cfjv ~/Dropbox/backup/kuli.20151128.tar.bz2 --exclude './legacy' .
tar cfjv ~/Dropbox/backup/kuli.20151128.tar.bz2 --exclude='./legacy' .
tar cfjv ~/Dropbox/backup/kuli.20151128.tar.bz2 --exclude 'workspace/legacy' .

等等,我也尝试过将排除开关放在命令的末尾。

但是都没有起作用。所有命令都完全忽略了排除命令。

如何实现这一点?

2个回答

17
根据man page的说明,选项需要放在文件和目录列表之前: tar {-c} [options] [files | directories] 此外,-f--exclude 选项需要参数:-f file--exclude pattern
因此,在您的情况下,应该使用以下命令: tar cjv --exclude 'legacy' -f ~/Dropbox/backup/kuli.20151128.tar.bz2 .

抱歉@baf,您误读了“man”页面。符号“[files | directories]”表示要包含在归档中的文件列表;这与“-f”无关。 “f”是用于命名目标文件的选项;作为选项,它与占位符符号“[options]”一起使用。没有关于排序的指示。我正在测试Darwin 19.6.0,这是macOS Catalina 10.15.7,我无法重现问题中的错误;“--exclude”的功能不取决于顺序。但是,我在使用“--files-from”时遇到了“--exclude”无法正常工作的问题。 - IAM_AL_X
@IAM_AL_X 我没有读错。我指的是file,这是-f选项的必需参数,而不是files | directories。另一件事是你正在使用现代的macOS版本,它使用不同的tar版本。这个回答对你没有帮助。 - baf

17

有趣的是,我在 Mac OS X(版本 10.11.5)上无法让这个命令正常工作,直到我重新排列参数顺序,类似这样:

tar --exclude '/subdir1/' --exclude '/subdir2/' -zcvf "mybackup.tar.gz" ./myfolder


不是专家但我认为它有意义。-zcvf中的f与@baf在他的回答中使用的f相同。如果您尝试tar -zcvf --排除'./a/b' foo.tar.gz ./a/,则您的选项是f参数应该放置的位置。 tar -zcv --exclude './a/b' -f foo.tar.gz ./a也可以起作用。 - igarciaoliver
强调@igarciaoliver所说的,"f"是一个选项,必须跟随其参数。 "-f"引入目标文件的名称;在开关"f"和它引入的参数之间不能有"--"类型的选项。开关可以捆绑在一起,例如"cvf"或"-cvf"。显然,"f"不必是开关捆绑中的最后一个开关,但我个人永远不会像问题中那样使用"cfjv"("f"后面还跟着两个开关,"j"和"v"),我总是将"f"作为捆绑中的最后一个开关,例如"cjvf";这将"f"与它引入的参数连接起来。 - IAM_AL_X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接