Eu tenho essa linha muito simples em um script bash que é executado com sucesso (ou seja, produzindo o _data.tar
arquivo), exceto que ele não exclui os subdiretórios, é dito que ele exclui por meio da --exclude
opção:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Em vez disso, produz um _data.tar
arquivo que contém tudo em / data, incluindo os arquivos nos subdiretórios que eu queria excluir.
Alguma idéia do porquê? e como consertar isso?
Atualização Eu implementei minhas observações com base no link fornecido na primeira resposta abaixo (dir de nível superior primeiro, sem espaço em branco após a última exclusão):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Mas isso não ajudou. Todos os subdiretórios "excluídos" estão presentes no _data.tar
arquivo resultante .
Isso é intrigante. Se isso é um bug no tar atual (GNU tar 1.23, no CentOS 6.2, Linux 2.6.32) ou "extrema sensibilidade" do tar para espaços em branco e outros erros fáceis de perder, considero isso um bug. Para agora.
Isso é horrível : tentei o insight sugerido abaixo (sem rastro /*
) e ele ainda não funciona no script de produção:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Não vejo diferença entre o que tentei e o que Richard Perrin tentou, exceto as aspas e 2 espaços em vez de 1. Vou tentar isso (devo esperar que o script noturno seja executado como o diretório a ser copiado é enorme) e relata.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Estou começando a pensar que todas essas tar --exclude
sensibilidades não são alcatrão, mas algo no meu ambiente, mas então o que poderia ser isso?
Funcionou! A última variação tentada (sem aspas simples e espaço único em vez de espaço duplo entre os --exclude
) testou o funcionamento. Estranho, mas aceitando.
Inacreditável! Acontece que uma versão mais antiga tar
(1.15.1) excluiria apenas se o dir de nível superior fosse o último na linha de comando. Esse é exatamente o oposto de como a versão 1.23 exige. PARA SUA INFORMAÇÃO.
--exclude b
(espaço em vez de sinal de igual) vs.--exclude=b
. isso faz alguma diferença? (não deveria IMHO)--exclude=
na mesma linha. Portanto, a diferença deve ser o idiota/*
que eu anexei a cada subdiretório. Vou testar isso hoje à noite no script de produção e relatar de volta. Outro +1.Pode ser que sua versão
tar
exija que as--exclude
opções sejam colocadas no início dotar
comando.Consulte: https://stackoverflow.com/q/984204
Veja: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Alternativa:
Ainda outra
tar
dica de comando é daqui :fonte
--exclude=mydir/*
, ele não funciona (usandotar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); O debian provavelmente será enviado com muitas versões diferentes de tar ao longo dos anos.--exclude
antes-czf
.Para excluir vários arquivos, tente
Isso economizará algum código e dor de cabeça. Esta é uma solução global para todos os tipos de programas / opções. Se você também deseja incluir o diretório pai em sua seleção (nesse caso, dados), é necessário incluir uma vírgula à direita. Por exemplo:
fonte
mv /very/very/very/very/long/path/to/a/file{,.bak}
Esse link pode ser útil. http://answers.google.com/answers/threadview/id/739467.html
Duas diferenças imediatas entre a linha que não está funcionando e algumas dicas no link:
--exclude
.fonte
-MAK
chamou minha atenção e até agora consegui identificar as seguintes diferenças entre minha linha que não está funcionando e a seguinte: 1. Todas as exclusões vêm após o diretório de nível superior. 2. Não pode ter nenhum espaço após o último--exclude
. Vou testar essas idéias e relatar de volta. +1 por enquanto.Uma solução alternativa pode ser usar uma combinação
find ... -prune
etar
excluir os diretórios especificados.No Mac OS X, a
--exclude
opção GNUtar
parece funcionar como deveria.No caso de teste a seguir, os diretórios
/private/var/log/asl
e/private/var/log/DiagnosticMessages
devem ser excluídos de um arquivo compactado do/private/var/log
diretório.fonte
Talvez você possa tentar o comando com outra opção:
E verifique se está funcionando conforme o esperado.
fonte
Estou usando um mac e descobri que as exclusões não estavam funcionando, a menos que a pasta de nível superior seja o último argumento
exemplo de comando de trabalho:
PARA SUA INFORMAÇÃO:
fonte
No meu caso, não foi excluído por um motivo diferente.
O caminho completo vs o caminho relativo.
O diretório de exclusão e o diretório devem usar o mesmo formato de caminho (ou seja, o caminho completo ou os caminhos relativos)
Exemplo:
Isso não funcionará porque exclude usa o caminho completo, enquanto o destino usa um caminho relativo
Isso funciona porque ambos usam o caminho completo
Isso funciona porque ambos usam o caminho relativo
fonte
Em vez de
--exclude=
usar-X
com um arquivo de texto:http://www.cyberciti.biz/faq/exclude-fficient-files-when-creating-a-tarball-using-tar-command/
fonte
Notas adicionais à excelente resposta de R Perrin :
Suponha que você não queira arquivar caminhos absolutos, mas relativos, por exemplo, 'dados' em vez de '/ tmp / data'. Para excluir caminhos absolutos, seus argumentos de tar diferem com base na implementação de tar (gnu tar x bsd tar) que você usa:
fonte
Detectado agora no alcatrão (tar GNU) 1,29
Essa chamada não exclui dos arquivos especificados com --exclude-from:
Essa chamada funciona de forma coor correto:
A ordem dos parâmetros é importante!
fonte
Tentei todos os tipos de combinações, incluindo algumas das respostas listadas e simplesmente não consegui excluir os arquivos listados.
Então, farto de procurar a resposta para o que deveria ser um trabalho de cinco minutos, fiz o oposto: criei um arquivo das pastas que queria incluir.
Eu fiz isso criando um arquivo e adicionando a ele :
Algumas notas:
tar
(e não compactado tar.tgz
/.tar.gz
) - você pode compactá-lo posteriormente usandogzip mybackup.tar
tar tvf mybackup.tar
.fonte