как мне указать 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 .

Связанный контент