tar início da barra oblíqua

4

tar czf dist.tgz --exclude=".gitignore" .

Isso cria arquivos no tar com o "./", que mais tarde se torna um problema quando o servidor precisa extrair partes do tar.

Alguém poderia me dizer como empacotá-lo para que você não tenha liderança "./"?

    
por Aram 12.12.2012 / 16:41

6 respostas

6

Experimente a opção --xform , que usa uma expressão substituta semelhante a sed. Isso permite que você altere as referências de caminho para o arquivo, em vez de manipulá-lo durante a extração (como com os componentes --strip).

tar --exclude=.gitignore -cz --xform s:'./':: -f dist.tgz ./

Para listar os arquivos conforme eles são processados, adicione as opções -v e --show-transformed-name :

tar --exclude=.gitignore -cvz --xform s:'./':: --show-transformed-name -f dist.tgz ./

O argumento para passar --xform segue essa estrutura: s/regexp/replace/[flags] Observe que no meu exemplo, usei : como um delimitador; você pode usar qualquer caractere que quiser, desde que o use de forma consistente. Boa referência aqui .

    
por 09.10.2013 / 17:17
4

Existem várias maneiras de conseguir isso, muitas das quais já foram sugeridas nesta questão, algumas das quais não foram. Esta é minha tentativa de compilá-los todos (com referências) e mostrar exemplos para facilitar a leitura, permitindo que o leitor escolha um para atender às suas necessidades.

Exemplo de árvore de entrada

Esta é a estrutura que será apresentada nos exemplos a seguir.

.dotfile
dir/
  .hidden
  file.txt
root.txt

Solução POSIX (Cross-Platform, Cross-Shell)

Você pode usar pax em vez de tar, como Phil P. apontou .

Comportamento habitual:

$ pax -wzvf ../ball.tar.gz .
[…]
$ pax -zf ../ball.tar.gz
.
./.dotfile
./dir
./dir/.hidden
./dir/file.txt
./root.txt

Sem barra:

$ pax -wzvf ../ball.tar.gz -s ':^\./::' .
[…]
$ pax -zf ../ball.tar.gz
.
.dotfile
dir
dir/.hidden
dir/file.txt
root.txt

Solução de globulação de conchas (multiplataforma)

Você também pode usar * em vez de . , como - apontou . Essa solução é basicamente uma forma abreviada da resposta do chutz, já que o shell irá expandir o asterisco no exemplo abaixo para todos os arquivos não ocultos antes de passá-los como argumentos para o programa tar .

Não há barra (mas observe a falta de nível de raiz .dotfile ):

$ tar -czvf ../ball.tar.gz *
[…]
$ tar -tzf ../ball.tar.gz
dir/
dir/.hidden
dir/file.txt
root.txt

Se você não se importa com o empacotamento de arquivos de ponto na CWD, está feito.

Se você fizer cuidado, não estará sem recursos. Em muitos shells (por exemplo, bash ), é possível incluir arquivos de ponto no shell glob alterando uma opção de shell. Com o bash, isso é feito com shopt :

dotglob

If set, bash includes filenames beginning with a '.' in the results of pathname expansion.

$ shopt -s dotglob  # Include dot-files in pathname expansions
$ tar -czvf ../ball.tar.gz *
[…]
$ shopt -u dotglob  # Restore shell's default globbing behavior
$ tar -tzf ../ball.tar.gz
.dotfile
dir/
dir/.hidden
dir/file.txt
root.txt

Solução GNU (Linux)

Use --xform como mencionado em answer .

Comportamento habitual:

$ tar -czvf ../ball.tar.gz .
[…]
$ tar -tzf ../ball.tar.gz
./
./root.txt
./.dotfile
./dir/
./dir/file.txt
./dir/.hidden

Sem barra:

$ tar -czvf ../ball.tar.gz --xform 's:^\./::' . [--show-transformed-names|--show-stored-names]
[…]
$ tar -tzf ../ball.tar.gz
./
root.txt
.dotfile
dir/
dir/file.txt
dir/.hidden

Solução BSD (Mac OS X)

Use -s , que é enganosamente similar a pax / sed , mas não completamente, como mostrado abaixo.

Comportamento habitual:

$ tar -czvf ../ball.tar.gz .
[…]
$ tar -tzf ../ball.tar.gz
./
./.dotfile
./dir/
./root.txt
./dir/.hidden
./dir/file.txt

Sem barra:

$ tar -czvf ../ball.tar.gz -s '/.//' .
tar: Removing leading '/' from member names
[…]
$ tar -tzf ../ball.tar.gz 
.dotfile
dir/
root.txt
dir/.hidden
dir/file.txt
    
por 23.03.2016 / 23:59
2

Não tenho certeza da versão de tar , mas normalmente é necessário especificar quais arquivos você deseja arquivar. Como tar c . para compactar tudo no diretório local. Executando seu comando na minha máquina eu recebo:

tar: Cowardly refusing to create an empty archive

Portanto, se você não quiser obter o ./ , que é o que obtém quando compactar o diretório local . , basta especificar os arquivos diretamente. Por exemplo:

> tar c hosts fstab | tar tv
-rw-r--r-- root/root      1225 2012-10-20 13:37 hosts
-rw-r--r-- root/root       678 2012-05-13 22:09 fstab
    
por 12.12.2012 / 16:45
1

Eu usei tar -P para preservar o / (em vez de ./ ). No entanto, não está totalmente claro se isso ajudaria no seu caso.

-P, --absolute-names
    don't strip leading '/'s from file names 

man tar

    
por 12.12.2012 / 16:59
1

Nas versões antigas do tar, costumava usar os nomes completos dos caminhos que você forneceu, no tar, mas isso é de alguma forma problemático, como se poderia querer uma segunda cópia de algo e uma expansão não intencional do arquivo tar no antigo dias de formato, pode sobrescrever um arquivo ou arquivos existentes.

Assim, nas versões mais recentes do tar binário, distribuído em quase qualquer distribuição linux, coloca o ./ no início de cada arquivo que ele empacota, de forma que, uma expansão não intencional, expande o arquivo para seu diretório de trabalho atual e abaixo.

Não sei ao certo por que isso está causando um problema para você. Se você estiver no nível de diretório correto, onde deseja expandir esse arquivo, ele fará exatamente isso. Por exemplo, digamos que você tenha um arquivo como

/tmp/myarchive.tar

e vamos supor que o conteúdo do arquivo seja

./etc/hosts
./etc/profile
./etc/passwd
./etc/group

se você expandir este arquivo enquanto seu diretório de trabalho atual for / (ou seja, nível de raiz), esses arquivos irão sobrescrever os existentes

/etc/hosts
/etc/profile
/etc/passwd
/etc/group

se é isso que você quer, você tem. Mas digamos que você só queria que os arquivos hosts saíssem desse arquivo, mas de repente você apagou os arquivos passwd e group do perfil. Espero que você tenha um bom backup neste momento, para que você possa recuperá-los

Mas, se você é do tipo sysadmin, que evita estar no nível raiz, a menos que ele precise disso intencionalmente, provavelmente você está logado e localizado em / home / algum-usuário ou se você logou como root, você está no diretório / root. Vamos dizer seu in / root. quando você executa o comando

# tar -xvf /tmp/myarchive.tar

você vai acabar com

/root/etc/hosts
/root/etc/profile
/root/etc/passwd
/root/etc/group

sem danos, sem falta. Então

# mv /root/etc/hosts /etc/hosts

Voila. Você realizou seu objetivo.

    
por 12.12.2012 / 17:05
0

Eu uso isso:

tar --create --directory a_dir $(ls --almost-all a_dir) > archive.tar

Isso listará todos os arquivos e diretórios (excent . e .. ) do diretório a_dir e os adicionará ao archive. As opções --directory definem a raiz de onde o tar começará a procurar arquivos.

    
por 20.11.2018 / 12:38

Tags