如何告诉 tar 仅排除根目录之外的目录,而不排除树中更深层次的同名目录?

如何告诉 tar 仅排除根目录之外的目录,而不排除树中更深层次的同名目录?

文件夹结构:

etc (dir)
deploy (dir)
src (dir)
config (dir)
dist
 ├- config (dir) 
 ├- index.js

我想做的是将除根配置文件夹之外的所有内容打包并将其放在 .tar 文件中deploy。该dist/config文件夹出现在输出中非常重要。开始于:

tar -czf deploy/deploy.gz   --exclude=deploy  --exclude="./config/"  ./*

$ l ./deploy/deploy0/dist 
index.js
router.js
test

但这会导致缺失dist/config。我能过来的唯一方法dist/config是如果我不尝试排除任何名为 config 的内容:

tar -czf deploy/deploy.gz   --exclude=deploy   ./*

$ l ./deploy/deploy1/dist 
config
index.js
router.js
test

OSX 和 CentOS(开发和构建)。那个男人为了柏油让我觉得这是不可能的。

我通过删除不需要的文件夹来解决这个问题,因为这是在构建环境中并且文件是一次性的。

答案1

你可以用来find创建你的论点 - 虽然有点长:

 find -mindepth 1 ! -wholename './config' ! -wholename './config/*'

mindepth 1排除.,以及wholename目录本身及其内容的两个排除。

tar -xzf deploy/deploy.gz --exclude="deploy" \
$( find -mindepth 1 ! -wholename './config' ! -wholename './config/*' )

答案2

使用对当前目录的点引用作为存档根是一个锚点:

tar --exclude='./deploy' --exclude='./config' -cvf deploy/deploy.tar .

但如果您使用目录名或通配符,那么该--anchored标志将提供帮助:

tar --anchored --exclude=deploy --exclude=config -cvf deploy/deploy.tar *

答案3

确保将--exclude选项放在源参数、目标参数之前

tar --exclude=deploy --exclude="./config" -cvz deploy/deploy.gz .

答案4

您可以./在排除的文件的开头使用标记。

我这样使用它:

tar --exclude='./build.tar.gz' --exclude='./config' -czf build.tar.gz .

相关内容