【问题标题】:How to exclude directories with TAR on OSX?如何在 OSX 上使用 TAR 排除目录?
【发布时间】:2016-03-02 15:56:50
【问题描述】:

这是我在 MacOSX-Machine 上的当前目录结构:

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' .

等等。我还尝试将 exlude-switch 放在命令的末尾。

但没有任何效果。所有命令都完全忽略排除命令。

如何做到这一点?

【问题讨论】:

    标签: macos backup archive tar


    【解决方案1】:

    根据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”页面。符号“[文件|目录]”表示要包含在存档中的文件列表;这与“-f”无关。 “f”是命名目标文件的选项;作为一个选项,它与占位符符号“[options]”一起使用。没有关于订购的指示。我正在 Darwin 19.6.0 上进行测试,即 macOS Catalina 10.15.7,我无法重现问题中的错误; “--exclude”的功能不依赖于顺序。但是,让“--exclude”与“--files-from”一起工作时,我确实遇到了问题。
    • @IAM_AL_X 我没有误读。我指的是file,这是-f 选项的强制参数,而不是files | directories。另一件事是您使用的是现代 macOS 版本,它使用不同的 tar 版本。此回复对您没有帮助。
    【解决方案2】:

    奇怪的是,我无法让它在 Mac OS X(版本 10.11.5)上运行,直到我将参数的顺序重新排列为类似

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

    【讨论】:

    • 不是专家,但我相信这是有道理的。 -zcvf 中的 f 与 @baf 在他的答案中使用的 f 相同。如果您尝试 tar -zcvf --exclude './a/b' foo.tar.gz ./a/ 您的选项就是 f 参数应该在的位置。 tar -zcv --exclude './a/b' -f foo.tar.gz ./a 也可以。
    • 强化@igarciaoliver 所说的,“f”是一个选项,后面必须跟它的参数。 “-f”引入目标文件的名称;开关“f”和它引入的参数之间不能有“--”类型选项。开关可以捆绑在一起,如“cvf”或“-cvf”。显然“f”不必是一组开关中的最后一个开关,但我个人永远不会像问题中那样使用“cfjv”(“f”后面跟着两个开关,“j”和“v”),我总是将“f”作为捆绑包中的最后一个开关,如“cjvf”;这将“f”与其引入的参数连接起来。
    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多