![使用 tar 时无法排除目录](https://linux22.com/image/150292/%E4%BD%BF%E7%94%A8%20tar%20%E6%97%B6%E6%97%A0%E6%B3%95%E6%8E%92%E9%99%A4%E7%9B%AE%E5%BD%95.png)
我的主目录中有一个文件夹,其结构如下:
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 调用中。