Eu tento tar.gz um diretório e uso
tar -czf workspace.tar.gz *
O tar resultante inclui .svn
diretórios em subdiretórios mas NÃO no diretório atual (visto que *
é expandido para apenas os arquivos 'visíveis' antes de ser passado para o tar
Eu tentei
tar -czf workspace.tar.gz .
em vez disso, estou recebendo um erro porque '.' mudou durante a leitura:
tar: ./workspace.tar.gz: file changed as we read it
Existe um truque para *
corresponder a todos os arquivos (incluindo com prefixo de ponto) em um diretório?
(usando bash no Linux SLES-11 (2.6.27.19)
linux
bash
design-patterns
tar
Micha
fonte
fonte
Respostas:
Não crie o arquivo tar no diretório que você está empacotando:
faz o truque, exceto que irá extrair os arquivos de todo o diretório atual quando você descompactar. Melhor fazer:
cd .. tar -czf workspace.tar.gz workspace
ou, se você não sabe o nome do diretório em que estava:
base=$(basename $PWD) cd .. tar -czf $base.tar.gz $base
(Isso pressupõe que você não seguiu links simbólicos para chegar onde está e que o shell não tenta adivinhar você saltando para trás através de um link simbólico -
bash
não é confiável a este respeito. Se você tiver que se preocupar com isso, usocd -P ..
para fazer um diretório de mudança física. Estúpido que não seja o comportamento padrão na minha opinião - confuso, pelo menos, para aqueles para quemcd ..
nunca teve qualquer significado alternativo.)Um comentário na discussão diz:
A primeira parte do comentário não faz muito sentido - se o arquivo tar contém o diretório atual, ele não será criado quando você extrair o arquivo desse arquivo porque, por definição, o diretório atual já existe (exceto em circunstâncias muito estranhas )
A segunda parte do comentário pode ser tratada de duas maneiras:
/tmp
é um local possível - e mova-o de volta para o local original depois de concluído.--exclude=workspace.tar.gz
opção. A string após o=
é um padrão - o exemplo é o padrão mais simples - uma correspondência exata. Você pode precisar especificar--exclude=./workspace.tar.gz
se está trabalhando no diretório atual, contrariando as recomendações; você pode precisar especificar--exclude=workspace/workspace.tar.gz
se está trabalhando em um nível acima, conforme sugerido. Se você tiver vários arquivos tar para excluir, use '*
', como em--exclude=./*.gz
.fonte
Se você realmente não deseja incluir o diretório principal no tarball (e isso geralmente é uma má ideia):
fonte
Acdrtux
ou um dos nomes longos das funções. Uma letra de função não precisa ser prefixada com-
e pode ser combinada com outras opções de uma letra.Existem algumas etapas a serem seguidas:
*
por.
para incluir arquivos ocultos também.--exclude=workspace.tar.gz
pode ser usado para excluir o próprio arquivo.tar: .: file changed as we read it
erro quando o arquivo ainda não foi criado, certifique-se de que ele exista (por exemplo, usandotouch
), para que --exclude corresponda ao nome do arquivo. (Não corresponde ao arquivo não existe)Combinado esses resultados no seguinte script:
fonte
--verbose
, assim:-czvf
.no diretório deseja compactar (diretório atual) tente isto:
fonte
.gz
arquivos do diretório.Você pode incluir os diretórios ocultos voltando a um diretório e fazendo:
cd .. tar czf workspace.tar.gz workspace
Supondo que o diretório que você deseja criar gzip seja chamado de espaço de trabalho
fonte
tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
-
antes doczf
para fazer funcionar. Caso contrário, eu estava recebendoCannot stat: No such file or directory
uma mensagem de erro.Você pode corrigir o
.
formulário usando--exclude
:fonte
Atualização: adicionei uma correção para o comentário do OP.
irá realmente alterar o diretório atual, mas por que não colocar o arquivo em outro lugar?
tar -czf somewhereelse/workspace.tar.gz . mv somewhereelse/workspace.tar.gz . # Update
fonte
Na verdade, o problema está nas opções de compactação. O truque é canalizar o resultado do tar para um compressor em vez de usar as opções embutidas. A propósito, isso também pode fornecer uma melhor compactação, já que você pode definir opções de compactação extras.
Alcatrão mínimo:
Pipe para um compressor de sua escolha. Este exemplo é detalhado e usa xz com compactação máxima:
A solução foi testada no Ubuntu 14.04 e Cygwin no Windows 7. É uma resposta do wiki da comunidade, então fique à vontade para editar se você encontrar um erro.
fonte
O problema com a maioria das soluções fornecidas aqui é que o tar contém
./
no início de cada entrada. Portanto, isso resulta em ter.
diretório ao abri-lo por meio do compressor GUI. Então o que acabei fazendo é:ls -1A | xargs -d "\n" tar cfz my.tar.gz
Se você já tem um
my.tar.gz
diretório atual, pode querer executar o grep:ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
Esteja ciente de que xargs tem certo limite (consulte Recursos
xargs --show-limits
). Portanto, esta solução não funcionaria se você estiver tentando criar um pacote que possui muitas entradas (diretórios e arquivos) em um diretório que você está tentando tar.fonte
Boa pergunta. No ZSH, você pode usar o modificador globbing
(D)
, que significa "dotfiles". Comparar:ls $HOME/*
e
ls $HOME/*(D)
Isso exclui corretamente as entradas de diretório especiais
.
e..
. No Bash, você pode usar.*
para incluir os dotfiles explicitamente:ls $HOME/* $HOME/.*
Mas isso inclui
.
e..
também, então não é o que você estava procurando. Tenho certeza de que também há uma maneira de*
combinar dotfiles no bash.fonte
.??*
para corresponder a todos os arquivos de ponto, não.
e..
. Isso não obtém arquivos de ponto de caractere único (como.a
). Para obtê-los também, use o mais complicado.[^.]*
.Outra solução, presumindo que o número de itens na pasta não seja grande:
(
ls -A
imprime arquivos normais e ocultos, mas não "." e ".." comols -a
faz.)fonte
A especificação
.??*
incluirá arquivos e diretórios "dot" com pelo menos 2 caracteres após o ponto. A desvantagem é que não incluirá arquivos / diretórios com um único caractere após o ponto, como.a
, se houver algum.fonte
Se o espaço em disco não for um problema, isso também pode ser uma coisa muito fácil de fazer:
fonte
Eu mesmo tive uma situação semelhante. Eu acho que é melhor criar o tar em outro lugar e então usar -C para informar ao tar o diretório base para os arquivos compactados. Exemplo:
Desta forma, não há necessidade de excluir seu próprio tarfile. Conforme observado em outros comentários, -A listará os arquivos ocultos.
fonte
10 anos depois, você tem uma alternativa ao
tar
, ilustrado com Git 2.30 (Q1 2021), que usa "git archive
" ( man ) para produzir o tarball de lançamento em vez de tar.(Você não precisa do Git 2.30 para aplicar essa alternativa)
Consulte o compromisso 4813277 (11 de outubro de 2020) e o compromisso 93e7031 (10 de outubro de 2020) de René Scharfe (
rscharfe
) .(Incorporado por Junio C Hamano -
gitster
- no commit 63e5273 , 27 de outubro de 2020)Então, em vez de:
Você pode fazer usando apenas Git:
Isso foi proposto inicialmente porque, conforme explicado aqui , algumas plataformas exóticas podem ter uma distribuição tar antiga com opções ausentes.
fonte
Usar
find
é provavelmente a maneira mais fácil:find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+
find . -maxdepth 1
encontrará todos os arquivos / diretórios / links simbólicos / etc no diretório atual e executará o comando especificado por-exec
. O{}
no comando significa que a lista de arquivos vai aqui e\+
significa que o comando será executado como:ao invés de
fonte