como posso dizer ao tar para excluir apenas um diretório da raiz, mas não um diretório com o mesmo nome mais profundo na árvore?

como posso dizer ao tar para excluir apenas um diretório da raiz, mas não um diretório com o mesmo nome mais profundo na árvore?

Estrutura de pastas:

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

O que eu gostaria de fazer é empacotar tudo, exceto a pasta de configuração raiz, e colocá-la em um arquivo tar deploy. É importante que a dist/configpasta esteja presente na saída. Começou com:

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

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

Mas isso resulta em um arquivo dist/config. A única maneira de chegar dist/configlá é não tentar excluir nada chamado config:

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

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

OSX e CentOS (desenvolvimento e construção). O homem paraalcatrãome faz pensar que isso não é possível.

Eu resolvi isso apenas excluindo pastas que não quero, já que isso está em um ambiente de construção e os arquivos são descartáveis.

Responder1

Você poderia usar findpara criar seus argumentos - um pouco demorado:

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

mindepth 1para excluir .e duas wholenameexclusões para o próprio diretório, bem como seu conteúdo.

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

Responder2

Usar uma referência de ponto para o diretório atual como raiz do arquivo é uma âncora:

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

Mas se você usar um nome de diretório ou um curinga, o --anchoredsinalizador virá em seu socorro:

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

Responder3

Certifique-se de colocar --excludeas opções antes dos argumentos de origem e destino

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

Responder4

Você pode usar ./um marcador no início dos arquivos excluídos.

Eu uso assim:

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

informação relacionada