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

1

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 tar em deploy . É importante que a pasta dist/config 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 dist/config ausente. A única maneira de obter dist/config é se eu 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 (dev e build). O homem para tar me faz pensar que isso não é possível.

Eu trabalhei em torno disso, apenas excluindo as pastas que eu não quero, pois isso está em um ambiente de compilação e os arquivos são descartáveis.

    
por jcollum 20.10.2016 / 23:09

3 respostas

1

Você pode usar find para criar seus argumentos - um pouco longo:

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

mindepth 1 para excluir . e dois wholename exclusõ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/*' )
    
por 21.10.2016 / 10:53
0

Certifique-se de colocar as opções --exclude antes dos argumentos source, destination

tar --exclude=deploy --exclude="./config" -cvz deploy/deploy.gz .
    
por 20.10.2016 / 23:42
0

Com essa árvore de diretórios de esqueleto:

mkdir -p src config dist/config

O GNU tar parece fazer o que você deseja se você usar --exclude="./config" (sem a barra final):

$ tar --version
tar (GNU tar) 1.27.1
$ tar cf - --exclude="./config" ./* | tar tf -
./dist/
./dist/config/
./src/

No entanto, o tar no meu OS X ( bsdtar 2.8.3 - libarchive 2.8.3 ) parece eliminar ambas as cópias de config com a mesma linha de comando.

Portanto, uma maneira de contornar isso parece usar o tar GNU. :)

Outra seria tornar o arquivo um nível de diretório mais alto e incluir o diretório de nível superior nele (como é habitual no software Unix), para que possamos usar seu nome no exclude :

$ cd ..
$ tar cf - --exclude="dir/config" dir/* | tar tf -
dir/dist/
dir/dist/config/
dir/src/

Ou, se você tiver um shell compatível, use extglob para corresponder a tudo, menos ao único nome:

$ shopt -s extglob
$ tar cf - ./!(config)  | tar tf -
./dist/
./dist/config/
./src/

Ou use qualquer outra forma de remover um item da lista de nomes de arquivos, que deve ser simples se você souber que seus nomes de arquivo de nível superior não contêm nada mais especial do que alfanuméricos (especialmente nenhum espaço em branco).

    
por 21.10.2016 / 00:26