使用 tar 时无法排除目录

使用 tar 时无法排除目录

我的主目录中有一个文件夹,其结构如下:

top-tree
+-- .git
+-- branch1
|   +-- branch11
    |   +-- .idea
    |   +-- branch111
    |   +-- branch112
    |   +-- branch113
    |   +-- branch114
        |   +-- branch1141
        |   +-- branch1142
        |   +-- branch1143
    |   +-- branch115
    |   +-- branch116
    |   +-- branch117

现在,我想压缩整个内容,但必须排除所有隐藏目录,例如.git.idea以及一个至少有 2 个子目录的特定目录branch114(子目录的数量可能会不时变化)。

我尝试使用带有以下参数的 tar 命令来执行此操作:

tar -czvf archive.tar.gz --exclude=~/top-tree/branch1/branch11/branch114 --exclude=~/top-tree/.git --exclude=~/top-tree/branch1/branch11/.idea top-tree/

tar -czvf archive.tar.gz --exclude=~/top-tree/branch1/branch11/branch114 --exclude=~/top-tree/.*

但以上似乎都不起作用。每次都会显示该文件夹的全部内容top-tree都会放置在 archive.tar.gz 中。我已经尝试了很多东西(太多了,我无法在这里引用,包括一)本网站和其他网站中的建议,使用参数的排列等。但与其他类似问题不同,我的问题似乎是路径问题。我使用的 tar 版本是 1.29。为什么这不起作用?

答案1

您正在归档 form 的路径并排除 form 的路径。您的排除模式永远不会匹配任何内容。top-tree/stuff/home/skrowten/top-tree/stuff

简单的解决方案是

tar -czvf archive.tar.gz --exclude=top-tree/branch1/branch11/branch114 --exclude=top-tree/.git --exclude=top-tree/branch1/branch11/.idea top-tree

请注意,如果存在例如 a,top-tree/subdir/top-tree/.git那么这也将被排除。避免这种情况的一个技巧是使用 启动命令行路径,并依赖于仅出现在根目录中./的事实。.

tar -czvf archive.tar.gz --exclude=./top-tree/branch1/branch11/branch114 --exclude=./top-tree/.git --exclude=./top-tree/branch1/branch11/.idea ./top-tree

如果前导./令您烦恼,请将该选项添加--transform='s!^\./!!'到 tar 调用中。

相关内容